私はこの単純なpythonスクリプトをデーモン化しようとしています:
#!/usr/bin/python3
print('hello')
これが私のコマンドとステータスです:
root@gw-0317STLG0067 /lib/systemd/system # systemctl enable test.service
root@gw-0317STLG0067 /lib/systemd/system # systemctl daemon-reload
root@gw-0317STLG0067 /lib/systemd/system # systemctl start test.service
root@gw-0317STLG0067 /lib/systemd/system # systemctl status test.service
* test.service - My Script Service
Loaded: loaded (/usr/lib/systemd/system/test.service; enabled; vendor preset:
Active: inactive (dead) since Sun 2016-07-31 10:06:29 UTC; 4s ago
Process: 20620 ExecStart=/root/test.py (code=exited, status=0/SUCCESS)
Main PID: 20620 (code=exited, status=0/SUCCESS)
Jul 31 10:06:29 gw-0317STLG0067 systemd[1]: Started My Script Service.
Jul 31 10:06:29 gw-0317STLG0067 test.py[20620]: hello
そしてここに私のサービススクリプト:
[Unit]
Description=My Script Service
After=multi-user.target
[Service]
Type=simple
ExecStart = /root/test.py
[Install]
WantedBy=multi-user.target
なぜそれが死んでいるのか、そしてprintステートメントをデーモン化したときにどうなるのか?端末を爆破する必要がありますか?
スクリプトがそのエンドポイントに到達して終了するので、それは死んでいます。単一のprint
ステートメントがターミナルを爆破するのはなぜですか?デーモンは通常、ループで実行され、終了時間かどうかをチェックし、終了する場合(またはカーネルからの信号をキャッチする場合)に終了します。
スクリプトは通常、サービスとして開始され、非常に速く終了します(コマンドが1つだけあり、whileループなどで再実行されないため)。そのため、サービスがより早く終了し、ステータスを確認できます。いくつかのループを追加して(ログがスパムにならないようにタイムアウトして)、それがアクティブであることを確認できるようにします。
while True:
print('hello')
time.sleep(2)
十分に(journalctl -u test.service
を使用して)確認したらすぐに、systemctlを使用して強制終了します。
あなたのpythonスクリプトは 'hello world'を出力し、次にpythonはスクリプトの終わりに達したことを認識し、実行を終了します。
Systemdで何をしたいですか?
次のような簡単なshスクリプトを試してください。
#!/bin/sh touch /tmp/myfile$$.txt echo /tmp/myfile$$.txt tail -f /tmp/myfile$$.txt
サービスステータスで<file>
の名前を取得します。
次に、ターミナルでテキストをパイプでパイプします:echo "Hello World" >> <file>
とサービスを調べます。
ループして繰り返し印刷するサービスは、端末をいっぱいにします....ここでは、ファイルを読み取り、必要なときにテキストを自由に入力できます。サービスを開始するたびに新しいファイルが作成されます。$$
はPIDです。次に、演習として、サービスを停止するときに/tmp/myfile$$.txt
ファイルを削除します;-)
演習のキーワード:trap
は一方向です;-)
物事をシンプルに保ち、学び、それに追加してください。 pythonもシグナルに反応する可能性があります。shを選択したのは、簡単に始められます...