Shell script to capture Process ID and kill it if exist

I tried this code and it is not working

#!/bin/sh


#Find the Process ID for syncapp running instance


PID=`ps -ef | grep syncapp 'awk {print $2}'`


if [[ -z "$PID" ]] then
Kill -9 PID
fi

It is showing a error near awk.

Any suggestions please.

276363 次浏览

You probably wanted to write

`ps -ef | grep syncapp | awk '{print $2}'`

but I will endorse @PaulR's answer - killall -9 syncapp is a much better alternative.

Actually the easiest way to do that would be to pass kill arguments like below:

ps -ef | grep your_process_name | grep -v grep | awk '{print $2}' | xargs kill

Hope it helps.

PID=`ps -ef | grep syncapp 'awk {print $2}'`


if [[ -z "$PID" ]] then
**Kill -9 $PID**
fi

A lot of *NIX systems also have either or both pkill(1) and killall(1) which, allows you to kill processes by name. Using them, you can avoid the whole parsing ps problem.

Came across somewhere..thought it is simple and useful

You can use the command in crontab directly ,

* * * * * ps -lf | grep "user" |  perl -ane '($h,$m,$s) = split /:/,$F
+[13]; kill 9, $F[3] if ($h > 1);'

or, we can write it as shell script ,

#!/bin/sh
# longprockill.sh
ps -lf | grep "user" |  perl -ane '($h,$m,$s) = split /:/,$F[13]; kill
+ 9, $F[3] if ($h > 1);'

And call it crontab like so,

* * * * * longprockill.sh
#!/bin/sh


#Find the Process ID for syncapp running instance


PID=`ps -ef | grep syncapp 'awk {print $2}'`


if [[ -z "$PID" ]] then
--->    Kill -9 PID
fi

Not sure if this helps, but 'kill' is not spelled correctly. It's capitalized.

Try 'kill' instead.

This works good for me.

PID=`ps -eaf | grep syncapp | grep -v grep | awk '{print $2}'`
if [[ "" !=  "$PID" ]]; then
echo "killing $PID"
kill -9 $PID
fi

Try the following script:

#!/bin/bash
pgrep $1 2>&1 > /dev/null
if [ $? -eq 0 ]
then
{
echo " "$1" PROCESS RUNNING "
ps -ef | grep $1 | grep -v grep | awk '{print $2}'| xargs kill -9
}
else
{
echo "  NO $1 PROCESS RUNNING"
};fi

I use the command pkill for this:

NAME
pgrep, pkill - look up or signal processes based on name and
other attributes


SYNOPSIS
pgrep [options] pattern
pkill [options] pattern


DESCRIPTION
pgrep looks through the currently running processes and lists
the process IDs which match the selection criteria to stdout.
All the criteria have to match.  For example,


$ pgrep -u root sshd


will only list the processes called sshd AND owned by root.
On the other hand,


$ pgrep -u root,daemon


will list the processes owned by root OR daemon.


pkill will send the specified signal (by default SIGTERM)
to each process instead of listing them on stdout.

If your code runs via interpreter (java, python, ...) then the name of the process is the name of the interpreter. You need to user the argument --full. This matches against the command name and the arguments.

This should kill all processes matching the grep that you are permitted to kill.

-9 means "Kill all processes you can kill".

kill -9 $(ps -ef | grep [s]yncapp | awk '{print $2}')
Kill -9 PID

should be

kill -9 $PID

see the difference?