I'm likely going to explain this clumsily, so apologies in advance:
I have the following script:
#!/bin/bash
pidPrefix="logGen"
checkPrime ()
{
if /sbin/ifconfig eth0:0|/bin/grep -wq inet;then isPrime=1;else isPrime=0;fi
}
killScript ()
{
/usr/bin/find /var/run -name "${pidPrefix}.*.pid" |while read pidFile;do
if [[ ! "${pidFile}" =~ "${$}" ]];then
#/bin/kill $(/usr/bin/tail -1 ${pidFile})
/bin/kill $(/bin/cat ${pidFile})
/bin/rm ${pidFile}
fi
done
}
echo "$$" > /var/run/${pidPrefix}.$$.pid
killScript
# echo "$$" > /var/run/${pidPrefix}.$$.pid
tail -F -n0 /opt/REDACTED/logs/manager.log|while read -a i;do
if [[ "${i[2]}" == "E" ]];then
if [[ "${i[7]:0:1}" == "@" ]];then
echo "${i[0]}|${i[1]}|${i[6]}|${i[@]:8:${#i[@]}}" >> /tmp/allerrors.${i[0]//\//.}.log
else
echo "${i[0]}|${i[1]}|${i[6]}|${i[@]:7:${#i[@]}}" >> /tmp/allerrors.${i[0]//\//.}.log
fi
fi
done
The bulk of it you can ignore, the main points are:
- the function killScript is meant to check for lock files in /var/run (excluding lock files created by the current instance of the script) and kill the pid inside the lock file.
- a tail is kicked off against a log file, and the output parsed into a separate logfile (if anyone actually cares, I can show sample input for the script, and explain what everything does, but it's not really relevant to my problem).
- The goal is that this script is run periodically on cron. Every time it's run, the last running instance of the script is killed, and a new one is started
So here's the issue. The script starts a child process, and just killing the first processes pid doesn't kill the child process. It just keeps running and running until manually killed. As seen below:
*
[root@liwmgmt02 utils]# bash new.logGen.sh #kick of an instance of the script
*
[root@liwmgmt02 utils]# ps -ef|grep [n]ew.log #in a separate terminal check pids
root 11391 7109 0 16:51 pts/1 00:00:00 bash new.logGen.sh
root 11395 11391 0 16:51 pts/1 00:00:00 bash new.logGen.sh
- So now the script is running, and there are two pids
[root@liwmgmt02 utils]# bash new.logGen.sh #in separate terminal start a second instance
- In the first terminal the script exited back to a prompt and says Terminated
*
[root@liwmgmt02 utils]# ps -ef|grep [n]ew.log
root 11395 1 0 16:51 pts/1 00:00:00 bash new.logGen.sh
root 14623 10569 0 16:52 pts/3 00:00:00 bash new.logGen.sh
root 14630 14623 0 16:52 pts/3 00:00:00 bash new.logGen.sh
- and now I have the child process of the script still running and doing stuff.
So yeah, this is my problem. How can I accomplish my goal of making a script that can kill previous instances of itself when it's run if the script spawns child processes?
Also, this script is far from done. There's still error checking to be added, and comments, and general tidying up. But I've reached this point and don't know how to proceed.