系统相关
首页 > 系统相关> > shell – Grepping变量

shell – Grepping变量

作者:互联网

我编写了一个简单的init脚本来启动和停止Python脚本作为服务.我必须明确我正在运行的Python版本,因为这是在带有Python 2.4和Linux的CentOS 5盒子上. 2.6安装(均通过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)我想为此init脚本添加“status”支持,并检查Bar.py是否正在运行.

解决方法:

我可能会遗漏一些东西,但我不明白你为什么要首先摆弄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

标签:python,shell,ps,init-script
来源: https://codeday.me/bug/20190814/1657272.html