我编写了一个简单的初始化脚本来启动和停止 Python 脚本作为服务。我必须明确我正在运行的 Python 版本,因为这是在安装了 Python 2.4 和 2.6 的 CentOS 5 机器上(均通过 yum)。
这是我到目前为止所拥有的:
#!/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=`ps -ef | grep '[p]ython26 /usr/local/bin/Foo/Bar.py' | awk '{ print $2 }'`
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
所以:
1)我想在文件名和目录名管理方面变得“更聪明”,并设置一些变量,以便稍后在脚本中重复任何内容(例如workdir)。我的主要问题是grep语句,我还没有弄清楚如何处理grep内部的变量。我希望有任何关于更有效的方法的建议。
2)我想向这个初始化脚本添加“状态”支持,并让它检查 Bar.py 是否正在运行。
答案1
我可能错过了一些东西,但我不明白你为什么要摆弄grep
。这就是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
该pgrep
命令旨在返回名称与给定模式匹配的进程的 PID。由于这是一个Python脚本,实际的过程是这样的:
python /usr/local/bin/Bar.py
进程名称在哪里python
。因此,我们需要使用 pgrep 的-f
标志来匹配整个名称:
-f, --full
The pattern is normally only matched against the process name.
When -f is set, the full command line is used.
为了确保这与 之类的内容不匹配fooBar.py
,该模式/Bar.py$
仅匹配/
字符串 ( $
) 中最后一个之后的部分。
为了将来参考,您永远不应该使用ps | grep
来获取 PID。这将始终返回至少两行,一行用于正在运行的进程,另一行用于您刚刚启动的 grep:
$ 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