변수 잡기

변수 잡기

Python 스크립트를 서비스로 시작하고 중지하기 위해 간단한 init 스크립트를 작성했습니다. Python 2.4 및 2.6이 설치된 CentOS 5 시스템에 실행 중인 Python 버전이 무엇인지 명확히 해야 했습니다(둘 다 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? 따라서 -f전체 이름과 일치하도록 pgrep의 플래그를 사용해야 합니다 .

   -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 | grepPID를 가져오는 데 절대 사용해서는 안 됩니다. 이는 항상 실행 중인 프로세스에 대한 줄과 방금 시작한 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

관련 정보