Fcron
Line 51: | Line 51: | ||
chown -R fcron:fcron /var/spool/fcron | chown -R fcron:fcron /var/spool/fcron | ||
/etc/init.d/fcron start | /etc/init.d/fcron start | ||
+ | |||
+ | Now fcron has to be set to start on boot. This is done by editing/creating a proper event.d script. If you don't know how to write one and you have a script here which modifies overclocking parameters, you can add this line at the last but one line. | ||
+ | |||
+ | /etc/init.d/fcron start | ||
+ | |||
+ | If you don't have this script, you can also add this to rcS-late script. Open it with: | ||
+ | |||
vi /etc/event.d/rcS-late | vi /etc/event.d/rcS-late | ||
Revision as of 11:30, 12 April 2010
fcron is standard Linux scheduler used to schedule any command at any time. So this means that it doesn't have any limits and you can schedule just about anything. It is run as daemon in the background so you don't need to worry about it. You set it up with a config file which contains schedule.
Contents |
Alternatives
cron
Why not: cron is older than fcron and doesn't sleep between events.
anacron
Why not: anacron is used to schedule daily jobs, fcron can schedule to minutes.
Why not: ses is buggy, buggy and buggy. It doesn't even uninstall properly.
Alarmed is the best alternative which has a GUI, but doesn't have CLI. You can use custom command so you can schedule anything, but you can't schedule it anytime like with fcron, because alarmd daemon doesn't provide an option for every possible time. The GUI also needs python, which consumes disk space.
Current issues
1. Current version for Maemo is not the latest available (although the difference is minor).
2. When you edit fcrontab it wants to execute vi from /scratchbox (editor variable has to be defined manually each time fcrontab is run).
3. Some stuff has to be done manually after the installation (with proper packaging the whole "Installation" chapter from this wiki would be unnecessary).
4. It needs to be added to official maemo.org repositories so it can be used by anyone (it is currently availible in user ruskie's repository).
But these are not major things and as you can see it can be used already - current solutions and workarounds are in (brackets). Otherwise it's stable, does not have important bugs and does not affect battery life at all. It's a mature software which just needs some manual work.
Installation
Everything should be done from root terminal. First you need to download the .deb from ruskie's repository. Put it somewhere on the device and execute the following commands, one by one:
dpkg -i /path/to/deb/fcron_3.0.1-2_armel_opt.deb apt-get install adduser adduser fcron apt-get purge adduser rm -r /home/fcron chown root:fcron /etc/fcron.* chmod 644 /etc/fcron.* chown -R fcron:fcron /var/spool/fcron /etc/init.d/fcron start
Now fcron has to be set to start on boot. This is done by editing/creating a proper event.d script. If you don't know how to write one and you have a script here which modifies overclocking parameters, you can add this line at the last but one line.
/etc/init.d/fcron start
If you don't have this script, you can also add this to rcS-late script. Open it with:
vi /etc/event.d/rcS-late
Last command opens rcS-late in vi text editor. You can use other text editor if you wish. After the line 38, which contains "initctl emit MOUNTS_OK" insert in a new line:
/etc/init.d/fcron start
And save this file. This makes fcron run at startup.
Configuration
fcrontab is a program which parses config file so fcron daemon can use it. It is used to modify schedule. From the root terminal first define the editor. This has to be done every time fcrontab is used.
export EDITOR=vi
Again, you can use another editor. Next, fcrontab must be executed in edit mode:
fcrontab -e
The config file opens and it is empty first time we open it. Now we will enter commands we would like to schedule. An example config file looks like:
!nolog(true) # COMMENT 0 9 * * 1-5 run-standalone.sh /path/to/script/silent_profile.sh <more scheduled scripts> !bootrun(true) 0 0 1 * * /path/to/script/reset_gprs_data_counter.sh <a backup script also suits here if you have one>
!nolog(true) is the first line and specifies that successful executions aren't logged (we really don't need or want that). Also, if we use a script with dbus call, run-standalone.sh must be in front of it. It sets up environment variables correctly for sending dbus calls as root. !bootrun(true) specifies that commands after this line are executed at next boot if system wasn't on when they should be executed. This is useful only for clearing the GPRS counter or backup scripts, for example if you switch the phone off every night the GPRS counter will still be reset every first of the month when you turn the phone on in the morning.
The first five fields are separated by a space:
MINUTE space HOUR space DAY_OF_MONTH space MONTH space DAY_OF_WEEK space /path/script.sh
To interpret the two example lines: GPRS data counter is reset every 1st of the month at 00:00. Silent profile is set every Monday to Friday at 9:00. Possible values for fields are:
Minute: 0-59
Hour: 0-23
Day of month: 1-31
Month: 1-12
Day of week: 0-7 (0 and 7 are both Sunday)
Asterisk (*) means "any", or to put it differently: it means that this value does not define when the command is run.
After saving the edited config file, fcrontab will install it automatically and it will work from that moment on. Also don't forget that commenting out lines is useful for temporarily disabling a command. Just put an # in front of the line.
Scripts
So we have fcron now executing scripts at defined time. But we still need to provide scripts that are executed. Here is a collection of them, but you can easily make new ones based on the example scripts here and Phone control wiki page. Don't forget to add them here though. And keep in mind that they have to be marked executable (chmod +x script.sh) to work. The second dbus call in some scripts is a notification and can me modified, removed or added.
Profiles
Silent
#!/bin/sh dbus-send --type=method_call --dest=com.nokia.profiled /com/nokia/profiled com.nokia.profiled.set_profile string:"silent" dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"Profile is set to Silent"
General
#!/bin/sh dbus-send --type=method_call --dest=com.nokia.profiled /com/nokia/profiled com.nokia.profiled.set_profile string:"general" dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"Profile is set to General"
Radio mode
2G
#!/bin/sh dbus-send --system --type=method_call --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.set_selected_radio_access_technology byte:1 dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"Network mode is set to 2G"
3G
#!/bin/sh dbus-send --system --type=method_call --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.set_selected_radio_access_technology byte:2 dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"Network mode is set to 3G"
Dual
#!/bin/sh dbus-send --system --type=method_call --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.set_selected_radio_access_technology byte:0 dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"Network mode is set to Dual"
Networking
Disconnect internet connection
#!/bin/sh dbus-send --system --dest=com.nokia.icd /com/nokia/icd_ui com.nokia.icd_ui.disconnect boolean:true dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"Internet connection is disconnected"
Disconnect mobile network
#!/bin/sh dbus-send --system --type=method_call --dest=com.nokia.phone.SSC /com/nokia/phone/SSC com.nokia.phone.SSC.set_radio boolean:false dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"Mobile network is disconnected"
Connect mobile network
#!/bin/sh dbus-send --system --type=method_call --dest=com.nokia.phone.SSC /com/nokia/phone/SSC com.nokia.phone.SSC.set_radio boolean:true dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"Mobile network is connected"
Disable Wi-Fi
#!/bin/sh run-standalone.sh dbus-send --system --dest=com.nokia.icd /com/nokia/icd_ui com.nokia.icd_ui.disconnect boolean:true ifconfig wlan0 down rmmod wl12xx run-standalone.sh dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:'Wi-Fi disabled'
Enable Wi-Fi
#!/bin/sh modprobe wl12xx wl1251-cal stop wlancond start wlancond ifconfig wlan0 up run-standalone.sh dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:'Wi-Fi enabled'
Securing device
Lock
#!/bin/sh dbus-send --system --type=method_call --dest=com.nokia.system_ui /com/nokia/system_ui/request com.nokia.system_ui.request.devlock_open string:"com.nokia.mce" string:"/com/nokia/mce/request" string:"com.nokia.mce.request" string:"devlock_callback" uint32:'3'
Unlock
#!/bin/sh dbus-send --system --type=method_call --dest=com.nokia.system_ui /com/nokia/system_ui/request com.nokia.system_ui.request.devlock_close string:"com.nokia.mce" string:"/com/nokia/mce/request" string:"com.nokia.mce.request" string:"devlock_callback" uint32:'0'
Reset GPRS data counter
#!/bin/sh gconftool-2 -u /system/osso/connectivity/network_type/GPRS/gprs_rx_bytes gconftool-2 -u /system/osso/connectivity/network_type/GPRS/gprs_tx_bytes gconftool-2 -s /system/osso/connectivity/network_type/GPRS/gprs_reset_time --type=string $(date +%s)
Update e-mail
This script has already necessary run-standalone.sh prefixes so the whole script does not need to be run through run-standalone.sh in fcrontab. But you need to insert proper IAP_ID in the script.
What it does is that it checks whether the phone is connected to the internet and if it is, send and receive is performed and if it is not, the defined connection (IAP_ID) is used to connect, then send and receive is performed and script waits about minute and a half (Modest e-mail client which N900 uses is slow in this aspect) and then disconnects internet.
#!/bin/sh get=`route | awk '/au/ {print $1}'` if [ `echo $get` = default ]; then run-standalone.sh dbus-send --type=method_call --dest=com.nokia.modest /com/nokia/modest com.nokia.modest.SendReceive else run-standalone.sh dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"Updating e-mail" run-standalone.sh dbus-send --system --type=method_call --dest=com.nokia.icd /com/nokia/icd com.nokia.icd.connect string:"IAP_ID" uint32:0 sleep 10 run-standalone.sh dbus-send --type=method_call --dest=com.nokia.modest /com/nokia/modest com.nokia.modest.SendReceive sleep 90 run-standalone.sh dbus-send --system --dest=com.nokia.icd /com/nokia/icd_ui com.nokia.icd_ui.disconnect boolean:true run-standalone.sh dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"E-mail updated" fi
Backup
The scripts used for backing up can be found on Manual backup and restore wiki page. They overlap with scripts needed here, so they should be collected there.
Reboot
Just put it directly in fcrontab:
0 0 * * * reboot
Warning 1: Never put it after !bootrun(true) line in fcrontab! It could result in an endless reboot loop.
Warning 2: Think twice before making a wrong time entry in fcrontab! The example here should suffice for most (it reboots device every midnight). Change the two zeroes in other numbers if you want, but don't put asterisks or ranges in those two fields!
Also remember that PIN has to be entered after a reboot. There is another way with sending reboot call via D-Bus which doesn't request to reenter PIN, but that is a forced reboot (no filesystem synchronization, etc.) and thus not the proper way of doing it.
Tweakr profiles
This script is not tested yet. Also you must replace both "tweakrprofile" instances with the name of your profile (which should not be general or silent and should not be capitalized).
#!/bin/sh DBUSSET="dbus-send --print-reply --dest='com.nokia.profiled' /com/nokia/profiled com.nokia.profiled.set_value string:general string:\'%s\' string:\'%s\'" dbus-send --type=method_call --dest=com.nokia.profiled /com/nokia/profiled com.nokia.profiled.set_profile string:"general" gconftool-2 -s /system/tweakr/current-preset --type=string "tweakrprofile" gconftool-2 -a /system/tweakr/tweakrprofile|sed 's/^ //'|sed 's/ = /=/'|awk -F'=' "{cmd=sprintf(\"${DBUSSET}\", \$1, \$2);system(cmd)}"
Auto 2G with Wi-Fi
#!/bin/sh # # auto2g by J.LeFebvre # # Automatically sets 2G cellular mode when a valid Wi-Fi connection is running # This helps conserve battery life # # If an automatic connection to 3G is required when not on Wi-Fi then uncomment the two dbus commands under "set to 3G" line # if `/sbin/ifconfig wlan0 2>/dev/null | grep -q RUNNING`; then if `dbus-send --system --print-reply --type=method_call --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.get_selected_radio_access_technology | grep -q 'byte 2'`; then if (/bin/ping -c 1 www.google.com > /dev/null); then # set to 2G dbus-send --system --type=method_call --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.set_selected_radio_access_technology byte:1 dbus-send --system --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:'2G (GSM) cellular mode set' fi fi; else if `dbus-send --system --print-reply --type=method_call --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.get_selected_radio_access_technology | grep -q 'byte 1'`; then # set to 3G # dbus-send --system --type=method_call --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.set_selected_radio_access_technology byte:2 # dbus-send --system --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:'3G cellular mode set' echo > /dev/null fi fi