Following is my script 'Infinite.sh' code, I am running this script in background,Before running this script, i want to kill all previous instances. But this is killing my curent instance also.
kill -9 `ps ux|grep Infinite.sh|awk -F\ '{print $2}'`
while true;
do
echo -n "SLEEPING FOR 5 SECOND"
date
sleep 5
done
Simply check if the pid is the same as the one of the running script.
Something like this could work:
Anything can be dangerous. The better solution is to save your PID to a file everytime you run an instance. If a PID file exists and if the PID in that file is a valid and is an active process, kill that process. Save the PID of the current process after.
Just eliminate the current process' PID from the list. To do this making just the minimal change to your code:
The option
-v pid=$$
sets the awk variablepid
to the value of the current process' process ID. The expressionpid != $2 {print $2}
will print a process ID only if it differs from the current process' process ID.To simplify the code, we could use
pgrep
:As triplee points out in the comments,
kill -9
should only be used as a last resort.-9
(SIGKILL) prevents a process from cleaning up after itself, deleting temporary files, etc. Other signals that one may want to try first include-2
(SIGINT),-6
(SIGABRT), or-15
(SIGTERM, which is the default). As for which signals to use, Randal L. Schwartz recommends:For more details on why
kill -9
should be avoided, see here. For more information on the various Unix signals and their meaning, see wikipedia