백그라운드에서 계속 실행하려는 Python 스크립트를 호출하는 bash 스크립트가 있습니다. bash 스크립트를 시작하고 Python 스크립트가 실행될 수 있지만 bash 스크립트의 "stop" 명령을 사용하여 중지할 수는 없습니다.
Bash 스크립트는 다음과 같습니다.
#!/bin/bash
case $1 in
start)
echo 'Running test.py'
exec 2>&1 /opt/anaconda3/envs/my_env/bin/python /home/my_name/scripts/test.py &
echo 'Assigning pid'
echo $! > /home/my_name/scripts/test.pid;;
stop)
kill 'cat /home/my_name/scripts/test.pid';;
*)
echo "usage: "$1" {start|stop}" ;;
esac
exit 0
다음은 Python 스크립트입니다.
import time
from pathlib import Path
count = 0
while True:
with open(Path(__file__).parent.resolve() / "test.txt", 'a') as f:
f.write(str(count))
count += 1
time.sleep(1)
Python 코드는 잘 작동하므로 너무 많이 논의할 가치가 없습니다. 매초마다 텍스트 파일에 정수를 쓰고 매번 1씩 증가합니다.
Python 및 bash 스크립트가 포함된 폴더에서 명령줄을 통해 얻은 내용은 다음과 같습니다.
$ sudo ./test.sh start
Running test.py
Assigning pid
$ sudo ./test.sh stop
./test.sh: line 10: kill: cat /home/my_name/scripts/test.pid: arguments must be process or job IDs
$ ps -aux | grep test
root 91366 0.1 0.0 26704 9320 pts/6 S 19:39 0:00 /opt/anaconda3/envs/my_env/bin/python /home/my_name/scripts/test.py
VEIC\da+ 92004 0.0 0.0 14436 1012 pts/11 S+ 19:41 0:00 grep --color=auto test
$ cat test.pid
91366
test.pid
그러면 pid 파일에 기록된 pid가 명령에 의해 표시된 pid와 일치하는 것을 볼 수 있습니다 ps -aux | grep test
. 그러나 bash 스크립트와 함께 명령을 사용하려고 하면 stop
pid 파일의 내용이 프로세스 또는 작업 ID가 아니라는 메시지가 나타납니다.
나는 결국 이것을 Monit와 함께 사용하고 싶지만 그렇게 하기 전에 이 bash 스크립팅 어려움을 극복해야 합니다. 어떤 도움이라도 대단히 감사하겠습니다!
답변1
kill 'cat /home/my_name/scripts/test.pid';;
당신은 그것을 원할 수도 있습니다 :
kill `cat /home/my_name/scripts/test.pid`;;
(작은따옴표 대신 역따옴표)