私たちはsystemdによって処理される永久に実行されるシェルスクリプトを持っています。スペースを解放するには、このファイルを切り取る必要があります。
今日、スクリプトの実行が停止したという報告を受けました。しかし、状態を確認してみると次のようになります。
● ImportantService.service - Important daemon
Loaded: loaded (/etc/systemd/system/ImportantService.service; enabled; vendor preset: disabled)
Active: active (exited) since Wed 2020-04-29 16:46:48 WIB; 5 days ago
Process: 48877 ExecStop=/usr/local/bin/importantScript stop --instance XYZ (code=exited, status=0/SUCCESS)
Process: 48889 ExecStart=/usr/local/bin/importantScript start --instance XYZ (code=exited, status=0/SUCCESS)
Main PID: 48889 (code=exited, status=0/SUCCESS)
Tasks: 0
Memory: 48.0K
CGroup: /system.slice/ImportantService.service
ジョブがゼロであることを確認して手動で再開しました。今は正常に実行されています。前述の問題が原因であると疑われます。
問題は、将来そのような問題が発生した場合にsystemdにプロセスを再生成させる方法です。
.service ファイルは次のとおりです。
[Unit]
Description= Important daemon
[Service]
Type=oneshot
ExecStart=/usr/local/bin/importantScript start --instance XYZ
RemainAfterExit=true
ExecStop=/usr/local/bin/importantScript stop --instance XYZ
[Install]
WantedBy=multi-user.target
修正する:私のスクリプトの説明
の主な機能は、ImportantScript
特定の(arg)ディレクトリで特定のイベントが発生した場合に特定のタスクを実行するために無限ループを入力することです。さまざまなディレクトリに対して複数のインスタンスを起動できる必要があります。スクリプトを開始する前に、次のインスタンス仕様セットを追加する必要があります。
ImportantScript add --name XYZ --dir /path/to/dir ..etc..
これで始めることができますXYZ
。
インスタンスを起動するたびに、事前定義されたすべてのインスタンスを含むファイルにPIDを保存します(前のadd
コマンドを使用)。リストされていないPIDは、そのインスタンスがアイドル状態であることを示します。
インスタンスを停止するには、を呼び出すだけですImportantScript stop --instance name
。これはプロセスを終了し、ファイルからそのエントリを削除し、混乱した部分をクリーンアップします。
これがシステム化された恐怖の家の項目ではないことを願っています。
答え1
systemdにサービスを再起動させるには、Restart=
サービスオプションが必要です。Active: active (exited)
systemctl 出力に示されているように、サービス自体が終了している可能性があり、終了コードは 0 です。
最も一般的に考えられる構成のいくつかは、次のトピックで説明されています。man systemd.service
、例:
Restart=always
:明示的に停止されていない場合(たとえばsystemctl stop
、DBusを介して直接呼び出された場合)、StopUnit
サービスを再起動します。Restart=on-failure
:サービスが> 0終了コードで終了した場合は、再起動してください。Restart=no
:基本。サービスを再起動しないでください。
これはおそらく最も一般的に使用される設定です。上記のリンクされた表には、より多くのオプションがあります。