Python 스크립트를 실행하는 Bash 스크립트에서 "stop" 명령을 사용할 수 없습니다.

Python 스크립트를 실행하는 Bash 스크립트에서 "stop" 명령을 사용할 수 없습니다.

백그라운드에서 계속 실행하려는 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 스크립트와 함께 명령을 사용하려고 하면 stoppid 파일의 내용이 프로세스 또는 작업 ID가 아니라는 메시지가 나타납니다.

나는 결국 이것을 Monit와 함께 사용하고 싶지만 그렇게 하기 전에 이 bash 스크립팅 어려움을 극복해야 합니다. 어떤 도움이라도 대단히 감사하겠습니다!

답변1

  kill 'cat /home/my_name/scripts/test.pid';;

당신은 그것을 원할 수도 있습니다 :

  kill `cat /home/my_name/scripts/test.pid`;;

(작은따옴표 대신 역따옴표)

관련 정보