Am Sonntag, den 23.10.2005, 07:36 -0700 schrieb Drew Tomlinson: > I wrote a script to read a smbfs mounted filesystem and make symlinks to > the files locally. The script appears to run fine interactively and > fine most of the time when run by cron. I run the script every half > hour. Over the course of a week or so, 15 - 20 defunct sh processes > show up in the ps output. I've Googled and learned that the "child" (my > script) is exiting but the "parent" (cron) is still around. So now my > question is "why" and what's wrong with my script to cause this > occasional behavior. And more importantly, how can I fix it? :) > > Thanks for your help! > > Drew > > --- BEGIN --- > #! /bin/sh > > # 10/13/05 > # This script creates symlinks to media files on Blacklamb. Because MythTV > # needs to write it's own "." files and such, mounting a read-only share > and > # then creating symlinks locally keeps the share on Blacklamb clean. > > remote_dir="/multimedia/Pictures" > local_dir="/tv/pictures" > find_args="-iname \"*.jpg\" -or -iname \"*.gif\"" > > # Don't wipe out the entire directory or else MythTV has to recreate all its > # local cache files. Consider using find with above $find_args to remove > # symlinks and avoid listing each *.xxx explicitly. > echo -e "\nRemoving old symlinks from $local_pictures_dir..." > rm "$local_pictures_dir"/*.[Jj][Pp][Gg] > rm "$local_pictures_dir"/*.[Gg][Ii][Ff] > > # Default sh delimiter is a "space" and is stored in $IFS. > # This caused $original to be truncated at the first "space" in the file > name. > # Save $IFS and then set sh delimeter to a newline so 'for' loop works. > OLDIFS=$IFS > IFS=' > ' > echo -e "\nCreating new symlinks in $local_pictures_dir..." > > # Search directory contained in $remote_dir using criteria in $find_args > for original in \ > $( eval "/usr/bin/find $remote_dir \( $find_args \) -print" ) > do > > # Remove $remote_dir from filename and replace remaining "/" > with "-" > # and "spaces" with "_". Save in $newfile > newfile=`echo $original | cut --delimiter="/" --fields=4- | \ > sed -e s/"\/"/-/g -e s/" "/"_"/g` > > # Create symlink from original file to $newfile in $local_dir > # specified above. > ln -s "$original" "$local_dir/$newfile"
Just a suggestion: insert a minimum of error handling like ln -s "$original" "$local_dir/$newfile" if (( $? > 0 )) ; then logger -t "myscript" "That didn't work for some reason ; fi ... or something else at points where the script could fail. > > # Increase count by 1 > count=$(( count + 1 )) > done > > # Reset $IFS to original value > IFS=$OLDIFS > > # Print number of symlinks created. > echo -e "\nCreated $count symlinks." > > exit > --- END --- -- Mit freundlichen Grüßen Heinz Sporn SPORN it-freelancing Mobile: ++43 (0)699 / 127 827 07 Email: [EMAIL PROTECTED] [EMAIL PROTECTED] Website: http://www.sporn-it.com Snail: Steyrer Str. 20 A-4540 Bad Hall Austria / Europe -- gentoo-user@gentoo.org mailing list