追加読書

追加読書

systemd(実行ファイル)を使用してデーモンとして実行するC ++ベースのアプリケーションがあります。

ユニットファイル:

[単位]
説明=コンソールサービス
以降 = network.target

[提供する]
環境="ユーザー= Ubuntu" "パス=/home/ubuntu/console/bin"
作業ディレクトリ=/home/ubuntu/console/bin
ExecStart=/bin/sh -ec "exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --execコンソール実行ファイル "#2>/dev/null
ExecStop=/bin/sh -ec "exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --retry =TERM/30/KILL/5 --oknodo --exec consoleExecutable" #2>/dev/null
再開=失敗した場合
退室後の残り残量=いいえ
タイムアウト停止秒=10
正常終了ステータス= 0 1
タイムアウト開始時間(秒)= 360

[インストールする]
WantedBy =マルチユーザー。ターゲット

開始コマンドを実行するとサービスが開始されますが、すぐに終了信号を受信して​​終了します。何が起こっているのかについての手がかりはありますか?

sudo systemctl 状態 console.service
● console.service - コンソールサービス
   ロード済み:ロード済み(/etc/systemd/system/console.service;有効、ベンダーデフォルト:有効)
   アクティブ:1秒前の月曜日19:58:58 UTC以降無効になっています(stop-sigterm)。
  プロセス: 8706 ExecStop=/bin/sh -ec exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid - -retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable #2>/dev/null (コード=終了、ステータス=0/成功)
  プロセス: 8701 ExecStart=/bin/sh -ec exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo - -exec consoleExecutable #2>/dev/null (コード=終了、ステータス=0/成功)
 マスターPID:8701(コード=終了、状態=0/成功)
    タスク:1
   メモリ:1.8M
      CPU: 53ms
   Cグループ:/system.slice/console.service
           └─8705 コンソール実行ファイル

9月25日 19:58:58 mgmt1 systemd[1]: コンソールサービスを開始します。

sudo systemctl 状態 console.service
● console.service - コンソールサービス
   ロード済み:ロード済み(/etc/systemd/system/console.service;有効、ベンダーデフォルト:有効)
   アクティブ:947ミリ秒前月曜日19:59:01 UTC以降非アクティブ(非アクティブ)
  プロセス: 8706 ExecStop=/bin/sh -ec exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid - -retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable #2>/dev/null (コード=終了、ステータス=0/成功)
  プロセス: 8701 ExecStart=/bin/sh -ec exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo - -exec consoleExecutable #2>/dev/null (コード=終了、ステータス=0/成功)
 マスターPID:8701(コード=終了、状態=0/成功)

9月25日 19:58:58 mgmt1 systemd[1]: コンソールサービスを開始します。

答え1

環境="ユーザー= Ubuntu" "パス=/home/ubuntu/console/bin"
作業ディレクトリ=/home/ubuntu/console/bin
ExecStart=/bin/sh -ec "exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --execコンソール実行ファイル "#2>/dev/null
ExecStop=/bin/sh -ec "exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --retry =TERM/30/KILL/5 --oknodo --exec consoleExecutable" #2>/dev/null

これはsystemdの恐怖の家にほぼ似ています。そうできる恐怖の話がまだなかったら良かったでしょう。

start-stop-daemonサービスユニットですべてのタスクを実行するために使用しないでください。サービス部門はすでにこれを行っています。ExecStart.不要なPIDファイルがあるだけでなく、シェル構文コメントが許可されていると誤って仮定します。

そして他の答えで言うようにしないでくださいType=forking。これは状況を改善するとこんなに悪化します。

たわごとstart-stop-daemonは、仕事が間違っている理由です。プロセスが実行されていstart-stop-daemonないため~になるサービスは終了しますが、実際にはほぼ直ちに終了するので、systemdはサービスが終了すると思います。最初の出力では、systemdはクリーンアップ操作の後に実行されている残りのすべてのプロセスにメッセージをsystemctl status送信することを確認できます。これは、サービスが終了したと思うときに行うことです。SIGTERMExecStop

単に以下を行います。

タイプ=シンプル
作業ディレクトリ=/home/ubuntu/console/bin
ユーザー= Ubuntu
ExecStart=/home/ubuntu/console/bin/consoleExecutable

いいえ、ExecStop実際には必要ありません。Environment

追加読書

答え2

systemdはデーモンのpidが8701だと思います。つまり、start-stop-daemonデーモンのpidは8705です。ユニットファイルType=forking(下)でこれを設定する必要があります。[Service]デフォルトでは、Type=simpleプロセスは分岐しないと仮定されます。

しかし、なぜこの/bin/sh -ec exec /sbin/start-stop-daemonモンスターを使用するのですか? systemdはstart-stop-daemonが実行するすべての操作を処理できます。

関連情報