systemd:このサービスが無効になった(死んだ)理由は何ですか?

systemd:このサービスが無効になった(死んだ)理由は何ですか?

私はこの単純な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

なぜ死んで印刷された明細書を保護するために正確に何が起こるのですか?端末を爆破する必要がありますか?

答え1

スクリプトは通常サービスで始まり、非常に迅速に終了します(コマンドが1つだけで、whileループや再実行に似たループがないため)。サービスがはるかに速く終了し、ステータスを要求できます。アクティブな状態を確認するには、いくつかのループ(ログをスパムしないようにタイムアウトを含む)を追加してください。

while True:
    print('hello')
    time.sleep(2)

journalctl -u test.service十分な内容を確認したら、systemctlでその内容を終了してください。

答え2

スクリプトがエンドポイントに到達して終了するために死んだ。なぜprint一文がターミナルを爆破するのですか?デーモンは通常ループで実行され、終了する時間であることを確認し、そうであれば終了します(またはカーネルから信号をキャプチャした場合)。

答え3

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を選択しました...

関連情報