Eu posso estar sentindo falta de algo, mas não entendo por que você está mexendo com grep
em primeiro lugar. É para isso que pgrep
:
#!/bin/sh
# chkconfig: 123456 90 10
workdir=/usr/local/bin/Foo
start() {
cd $workdir
/usr/bin/python26 $workdir/Bar.py &
echo "FooBar started."
}
stop() {
pid='pgrep -f '/Bar.py$''
echo $pid
kill $pid
sleep 2
echo "FooBar stopped."
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Usage: /etc/init.d/foobar {start|stop|restart}"
exit 1
esac
exit 0
O comando pgrep
foi projetado para retornar os PIDs dos processos cujo nome corresponde ao padrão fornecido. Como esse é um script python, o processo real é algo como:
python /usr/local/bin/Bar.py
Em que o nome do processo é python
. Portanto, precisamos usar o sinalizador -f
do pgrep para corresponder ao nome inteiro:
-f, --full
The pattern is normally only matched against the process name.
When -f is set, the full command line is used.
Para garantir que isso não corresponda a coisas como fooBar.py
, o padrão é /Bar.py$
, para que corresponda apenas à parte depois do último /
e no final da string ( $
).
Para referência futura, você nunca deve usar ps | grep
para obter um PID. Isso sempre retornará pelo menos duas linhas, uma para o processo em execução e outra para o grep que você acabou de lançar:
$ ps -ef | grep 'Bar.py'
terdon 27209 2006 19 17:05 pts/9 00:00:00 python /usr/local/bin/Bar.py
terdon 27254 1377 0 17:05 pts/6 00:00:00 grep --color Bar.py