Slackware 12 - Break out crond of rc.M to allow custom PATH:s
On a machine running Slackware 12 I encountered a problem where the cron daemon had a incomplete PATH variable. Commands executed in the terminal did not work in cron, for example tar cJf (xz compression). I found examples online that suggested putting PATH=-declarations at the beginning of the /etc/crontab file. But this did not work as Slackware 12 uses Dillons cron, which wants to have PATH:s defined before it starts. I grep:ed through the /etc/rc.d startup scripts and found crond in /etc/rc.d/rc.M: # Start crond (Dillon's crond): # If you want cron to actually log activity to /var/log/cron, then change # -l10 to -l8 to increase the logging level. if [ -x /usr/sbin/crond ]; then /usr/sbin/crond -l10 >>/var/log/cron 2>&1 fi I could simply put my PATH=declaration in the IF-clause above. But as I did not want to pollute this important file with custom PATH declarations I decided to break out the start of cron to a separate file. This also allows restarting the cron daemon. This is what I did: Made a backup of rc.M: cp /etc/rc.d/rc.M /etc/rc.d/rc.M.backup && chmod -x /etc/rc.d/rc.M.backup Opened /etc/rc.d/rc.M in a text editor, and replaced this IF-clause: if [ -x /usr/sbin/crond ]; then /usr/sbin/crond -l10 >>/var/log/cron 2>&1 fi with this (comment the above out with # before the lines, so you can revert if you like): if [ -x /etc/rc.d/rc.crond ]; then /etc/rc.d/rc.crond start fi Save the file. Checked the PATH i wanted - the one the current user is running: echo $PATH Opened a new file at /etc/rc.d/rc.crond, filled it with the following: #!/bin/sh # # crontab rc script # # set this path for cron - replace with what you got from echo $PATH PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin WHAT="crond"; BINFILE=crond; BINFILE_FULLPATH="/usr/sbin/$BINFILE" start() { if /usr/bin/ps ax | /usr/bin/grep -v grep | /usr/bin/grep -v rc.$BINFILE | /usr/bin/grep $BINFILE > /dev/null then echo "$WHAT is already running"; exit; else echo "Starting $WHAT"; fi # Start crond (Dillon's crond): # If you want cron to actually log activity to /var/log/cron, then change # -l10 to -l8 to increase the logging level. if [ -x /usr/sbin/crond ]; then /usr/sbin/crond -l10 >>/var/log/cron 2>&1 fi } stop() { echo "Stopping $WHAT..." killall $BINFILE } # rc.crond start if [[ "$1" = "start" ]];then # do start(); start fi # rc.crond stop if [[ "$1" = "stop" ]];then # do stop(); stop fi # rc.crond restart if [[ "$1" = "restart" ]];then # do stop() stop # do start() start fi # --- Make the new file executable: chmod +x /etc/rc.d/rc.crond Test the file before rebooting: /etc/rc.d/rc.crond stop You should now have no crond running, test with ps ax|grep crond /etc/rc.d/rc.crond start Crond should now start, test again with ps ax|grep crond Try to reboot, use Shift + PageUp/PageDown to scroll in the log. If something fails completely use live-CD / live-USB pendrive and to revert rc.M from the backup. If everything goes as planned you may now have the custom PATH you defined in /etc/rc.d/rc.crond available to your cron scripts. Check it out by running a cron script with contents like this in it: #!/bin/bash echo $PATH >> /tmp/test.log Remember to change /etc/rc.d/rc.crond when editing PATH:s.
This is a personal note. Last updated: 2015-06-12 00:07:18.