How do you check if a process on Mac OS X is running using the process's name in a Bash script?
I am trying to write a Bash script that will restart a process if it has stopped but do nothing if it is still running.
How do you check if a process on Mac OS X is running using the process's name in a Bash script?
I am trying to write a Bash script that will restart a process if it has stopped but do nothing if it is still running.
Parsing this:
ps aux | grep [-i] $ProcessName | wc -l
...is probably your best bet. Here's a short script that does what you're after:
#!/bin/bash
PROCESS=myapp
number=$(ps aux | grep $PROCESS | wc -l)
if [ $number -gt 0 ]
then
echo Running;
fi
EDIT: I initially included a -i
flag to grep
to make it case insensitive; I did this because the example program I tried was python
, which on Mac OS X runs as Python
-- if you know your application's case exactly, the -i
is not necessary.
The advantage of this approach is that it scales with you -- in the future, if you need to make sure, say, five instances of your application are running, you're already counting. The only caveat is if another application has your program's name in its command line, it might come up -- regular expressions to grep
will resolve that issue, if you're crafty (and run into this).
Another way is to use (abuse?) the -d
option of the killall
command. The -d
options won't actually kill the process, but instead print what will be done. It will also exit with status 0
if it finds a matching process, or 1
if it does not. Putting this together:
#!/bin/bash
`/usr/bin/killall -d "$1" &> /dev/null`
let "RUNNING = ! $?" # this simply does a boolean 'not' on the return code
echo $RUNNING
To give credit where its due, I originally pulled this technique from a script in the iTunes installer.
does Mac have pidof? ...
if pidof $processname >/dev/null ; then echo $processname is running ; fi
It has for sure!
pgrep, pkill and pfind for OpenBSD and Darwin (Mac OS X)
http://proctools.sourceforge.net
(also available via MacPorts: port info proctools )
pidof by nightproductions.net
I lack the reputation to comment on the killall answer above, but there's killall -s
for doing it without sending any signals:
killall -s "$PROCESSNAME" &> /dev/null
if [ $? -eq 0 ]; then
echo "$PROCESSNAME is running"
# if you also need the PID:
PID=`killall -s "$PROCESSNAME" | awk '{print $3}'`
echo "it's PID is $PID"
fi