cron job question (for checking kernel updates)

Rick Stevens ricks at alldigital.com
Wed Oct 2 22:19:47 UTC 2013


On 10/02/2013 02:27 PM, Ranjan Maitra issued this missive:
> On Wed, 2 Oct 2013 13:34:36 -0700 Rick Stevens <ricks at alldigital.com>
> wrote:
>
>> On 10/02/2013 01:06 PM, Ranjan Maitra issued this missive:
>>> On Wed, 2 Oct 2013 09:26:32 -0700 Rick Stevens <ricks at alldigital.com>
>>> wrote:
>>>
>>>> On 10/02/2013 08:10 AM, Ranjan Maitra issued this missive:
>>>>> Hi,
>>>>>
>>>>> I have a cron job running which yum updates all my machines once a day.
>>>>> All of these work fine.
>>>>>
>>>>> I also have a cron job which checks for kernel updates every hour and
>>>>> sends me a message if an updated kernel has been installed. Here is the
>>>>> relevant script:
>>>>>
>>>>> --- begin file called check-kernel.sh in my scripts/yum directory---
>>>>>
>>>>> #!/bin/bash
>>>>>
>>>>> latestkernel=$(rpm -q kernel |tail -n1|sed -e 's/kernel-//')
>>>>>
>>>>> #echo "$latestkernel"
>>>>>
>>>>> if uname -a | grep -qv "$latestkernel"; then
>>>>> notify-send "Kernel UPDATE on ${HOSTNAME}: Running Kernel is $(uname
>>>>> -r) but lat est installed rpm is ${latestkernel}; REBOOT required"
>>>>> fi;
>>>>>
>>>>>
>>>>> --- end file called check-kernel.sh ---
>>>>>
>>>>> (A bit wordy, I know.)
>>>>>
>>>>> I have verified that this is executable and works from the commandline
>>>>> without any errors.
>>>>>
>>>>> I have the following set up via crontab -e:
>>>>>
>>>>> 0,15,30,45 * * * * nice -n 19 $HOME/.xplanet/download_xplanet_cloudmap
>>>>> 5 * * * * nice -n 19 $HOME/scripts/yum/check-kernel.sh
>>>>>
>>>>> The first line downloads cloudmaps for use with xplanet and works just
>>>>> fine (or appears to) and has done so for aeons.
>>>>>
>>>>> However, nothing happens (or appears to) for the second line.
>>>>>
>>>>> What is wrong here?
>>>>
>>>> The most common problem I've seen is that cron jobs typically have very
>>>> limited paths and the executables you're running (notify-send, uname)
>>>> may not be in the path the cronjob has. For giggles, do "echo $PATH" as
>>>> the user the cronjob will run as. Then build a cron job that echos
>>>> cron's concept of the path:
>>>>
>>>> 	#!/bin/bash
>>>> 	echo $PATH >/tmp/pathecho.txt
>>>>
>>>> and have cron run that once as the same user. Look at the data in
>>>> /tmp/pathecho.txt and I'll bet you'll find its far more restricted than
>>>> that of an interactive shell.
>>>
>>> I tried this: here is what I got --
>>>
>>> $ echo $PATH
>>> /bin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/home/user/bin
>>>
>>> $ cat /tmp/pathecho.txt
>>> /usr/bin:/bin
>>>
>>> Clearly more restrictive as you suggest.
>>>
>>> However, what I do not understand is why this does not "work" though. I
>>> do not understand because notify-send is in /usr/bin as well as in /bin:
>>>
>>> $ which notify-send
>>> notify-send is /bin/notify-send
>>> notify-send is /usr/bin/notify-send
>>>
>>> Both appear to be in the path. So where is the problem?
>>>
>>> I will also try the suggestions in the references in Matthew Miller's
>>> response now.
>>
>> You could try adding a "set -x" after the shebang line:
>>
>> 	#!/bin/bash
>> 	set -x
>>
>> That tells bash to print out every expansion. Then change your cron
>> entry to have a ">/tmp/test.txt 2>&1" at the end:
>>
>> 	5 * * * * nice -n 19 $HOME/scripts/yum/check-kernel.sh >/tmp/test.txt 2>&1
>>
>> Let the script run, then examine the /tmp/test.txt file to see what bash
>> doesn't like. Don't forget to remove the "set -x" from the script and
>> the ">... 2>&1" stuff from the crontab entry when you're done. Odds are
>> it's a path issue or something that isn't expanding as you think it
>> would because it's not an interactive shell running the script.
>> -----------------------------------------------------------------
>
> Here is what I get:
>
> $ more /tmp/test.txt
> ++ tail -n1
> ++ rpm -q kernel
> ++ sed -e s/kernel-//
> + latestkernel=3.11.2-201.fc19.i686
> + grep -qv 3.11.2-201.fc19.i686
> + uname -a
> ++ uname -r
> + notify-send 'Kernel UPDATE on subarnarekha.stat.iastate.edu: Running
> Kernel is 3.11.1-200.fc19.i686 but latest installed rpm is
> 3.11.2-201.fc19.i686; REBOOT r equired'
>
>
> I also tried explicitly putting in /usr/bin/notify-send (hardcoding it
> in) to the original code, but no effect.

Ok, so it looks like there's nothing wrong in the script so you can 
remove the "set -x" from the script and the ">/tmp/test.txt 2>&1" from
the crontab.

My guess is that the cron doesn't know that there is a GUI running and
so notify-send doesn't know where to send the message. I've seen some
stuff regarding this in one of the Ubuntu forums. Have a look at this:

http://askubuntu.com/questions/298608/notify-send-doesnt-work-from-crontab

In particular, look at the second and third answers (from danatela and 
krlmlr) and combine them (from danatela's answer to find who's logged
in on the GUI and krlmlr's answer to set the DBUS_SESSION_BUS_ADDRESS
for that user).
----------------------------------------------------------------------
- Rick Stevens, Systems Engineer, AllDigital    ricks at alldigital.com -
- AIM/Skype: therps2        ICQ: 22643734            Yahoo: origrps2 -
-                                                                    -
-           "I understand Windows 2000 has a Y2K problem."           -
----------------------------------------------------------------------


More information about the users mailing list