
詳細
systemd
次の関連ディレクティブを含むサービスファイルがあります。Type=forking
User=me
Restart=always
WantedBy
このディレクティブはまだ設定されていません。
実行するcronジョブがありますsu –l me –c '<some command>'
。
前提条件
私たちは以下を見つけました:
- サービスが開始されました
- ユーザー
me
はいいえログインシステム
観察結果
cronジョブの実行が完了するたびに、System V IPCキューが消え、サービスが再起動されます。これは、キュー内で読み取り/休止中のプロセスが起きてキューが消えて失敗状態になったことを発見するためです。
cron操作が完了した後、システムログで次の内容を確認しました。
… systemd[1]: Stopped User Manager for UID XXX
考えられる解決策
私たちのinstalled
ファイルは次のとおりです。
$ cat /etc/systemd/logind.conf.d/my-service.conf
[Login]
KillUserProcesses=no
RemoveIPC=no
質問
読んだ後システム変更ログ 230、上記の可能な解決策が十分かどうかはまだ混乱しています。
私たちが特に混乱しているのはadditional steps are necessary to allow intentionally long-running processes to survive logout.
報告されたサービスの親は、サービスを開始するために規定されたステップがここに適用されないと私たちを信じさせますsystemd-cgls
。これは本当ですか?現在サービスをリリースしていますsystem.slice
systemd-run
systemctl start my-service.service
それでもlingering
ユーザーのためにそれを有効にする必要がありますかme
?
助けてくれてありがとう。
答え1
その必要もありませんKillUserProcesses=no
。 RemoveIPC=no
それだけで十分です。
ユーザーの遅延を有効にするのが代替me
手段です。違いは、systemd --user
インスタンスが常に実行されていることです。
この動作はlogind.confのKillUserProcesses =設定によって制御されます。以前のデフォルト値「no」は「yes」に変更されました。これは、ユーザーセッションが後で適切にクリーンアップされますが、長期実行プロセスを意図的にログアウトしたままにするために追加の手順が必要であることを意味します。
この引用符は、KillUserProcesses = yesの場合にのみログアウト後もGNU Screenが引き続き実行されるようにするには、「追加ステップ」が必要であることを意味します。追加のステップはデフォルトでsystemd-run --user --scope COMMAND
AND遅延を有効にすることです。
それはあなたの希望とは何の関係もありません。これは、サービスプロセスがログインセッション内で実行されていないためです。
systemd-cglsを見て得た結論は絶対に正確です。
別のアプローチは、ユーザーとしてログインしないことですme
。 su
一度のログインとみなされます。ユーザーのcrontabはログインしていると見なすことができます(/etc/pam.d/cronがpam_systemdへの直接または間接呼び出しを防止しない限り)。たとえば、su
使用を置き換えるsetpriv
か、cronの代わりにsystemdタイマーデバイスを使用しますUser=me
。