/bin/sh Madness

Tim Daneliuk tundra at tundraware.com
Fri Feb 17 15:40:03 PST 2006


Dan Nelson wrote:

> In the last episode (Feb 16), Tim Daneliuk said:
> 
>>Here is a shell function that behaves quite strangely:
>>
>>#!/bin/sh
>>#####
>># Execute A Command, Noting Start/Stop Time, & Logging Output
>># Args:
>>#       $1 Command Name
>>#       $2 Log Directory
>>#       $3 Command String To Execute
>>#####
>>
>>runupd()
>>{
>>      log=$2/$1.log
>>      timestamp $log
>>      touch $2/.$1-begin && eval $3 2>&1 >> $log && touch $2/.$1-end &
>>}
>># End of 'runupd()'
>>
>>So, you might do something like:
>>
>>   runupd freespace /var/log/ "df -k"
>>
>>Now, for the weirdness.  This function works fine in my script
>>so long as one of two conditions is met:
>>
>>   1) I run it interactively from the command line (bash)
>>                      OR
>>   2) I run it from 'cron' AND $3 is *not* another script
>>
>>If I try to run it from 'cron' and point $3 to a script, everything gets
>>run as planned, however, the ending timestamp (touch $2/.$1-end) never
>>runs. That is, the initial time stamp (.$1-begin) and the command itself
>>are executed, and output is properly written to the logfile,
>>but the final timestamp never happens.
> 
> 
> Could your $3 command be returning a nonzero exit code?  You probably
> want something more like
> 
> touch $2/.$1-begin && { eval $3 2>&1 >> $log ; touch $2/.$1-end } &
> 
> so your end timestamp always gets created whether or not $3 succeeds.
> Also note that in your original script, you only backgrounded "touch
> $2/.$1-end", which is probably not what you wanted.
> 

This seems not to work - I don't think 'sh' likes nested function braces -
recall that this command appears inside a shell function.

In any case, I think I have nailed the problem.  It seems that the
external script being called made reference to 'chown' without explicitly
naming the program's path.  Under 'cron' control, there is no path to
/usr/sbin by default so the script was exiting with a non-zero exit status
as several here suggested.  <Wipes large glob off egg off  very red face>.

Many thanks to all who took time to answer.

-- 
----------------------------------------------------------------------------
Tim Daneliuk     tundra at tundraware.com
PGP Key:         http://www.tundraware.com/PGP/



More information about the freebsd-questions mailing list