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
送信することを確認できます。これは、サービスが終了したと思うときに行うことです。SIGTERM
ExecStop
単に以下を行います。
タイプ=シンプル 作業ディレクトリ=/home/ubuntu/console/bin ユーザー= Ubuntu ExecStart=/home/ubuntu/console/bin/consoleExecutable
いいえ、ExecStop
実際には必要ありません。Environment
追加読書
- ジョナサンデボインポラード(2015)。実際にデーモンは必要ありません。本当。。体系化された恐怖の家。
- ジョナサンデボインポラード(2016)。2つのサービスがある場合は、両方のサービスを定義します。。体系化された恐怖の家。
- ジョナサンデボインポラード(2015)。Unixデーモンの準備プロトコルの問題。よく与えられる答えです。
- Systemd はサービスを開始した直後にサービスを終了します。
答え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が実行するすべての操作を処理できます。