![변수 잡기](https://linux55.com/image/40216/%EB%B3%80%EC%88%98%20%EC%9E%A1%EA%B8%B0.png)
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 | 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