バックグラウンドで実行し続けたい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`;;
(一重引用符の代わりに逆引用符)