一人はできません。

一人はできません。

確認できる文書化された方法はありますか?サービス自体で実行されるプログラムのコードからsystemd、(対話型ログインセッション、cronなどではなく)によって開始されましたか?

.service現在の回避策は、unit()で環境変数を定義し、Environment=...その変数が私のコードにあることを確認することです。ただし、直接使用できるものがある可能性があります。

ベストアンサー1

一人はできません。

サービスを呼び出すプロセス(そのパラメータ、環境、それを含む制御グループ、リソース制限、オープンファイル記述子)にsystemdが提供するすべての機能は、他のサービス管理者が実行できます。また、どのサービス管理者がサービスを管理しているかを識別するための共有ルールはありません。一般的な環境変数もなく、他のフラグもありません。

誤ったメカニズム

親プロセスの実行可能ファイル名を解決することも検討できます。これは不可能だからhttps://unix.stackexchange.com/a/196252/5132。親プロセスの実行可能プログラムイメージ(システム全体のサービスに使用される)の名前は/sbin/initDebian Linuxオペレーティングシステムにあります。 Debianの習慣は、これが実際のプロセス1のプログラムイメージファイルへの代替スタイルシンボリックリンクであり、プログラムがinitramfsからの/init名前だけを知るだけです。

私が書いたものに関係なく、コントロールグループはシステム化されたタグだと思うかもしれません。そうではありません。以下は、service-managernoshツールセットとはまったく異なるサービスマネージャが管理するサービスプロセスの制御グループツリーです。

%systemd-cgls /system.slice/service-manager.service/[Eメール保護]
制御グループ/system.slice/service-manager.service/[Eメール保護]:
└─[Eメール保護]
  └─1433tinydns
%

プログラムtinydnsはで制御グループを見つけ/proc/self/cgroupたので、systemdが制御グループを設定すると仮定する理由はありません。実際にユーティリティによって設定されますmove-to-control-group

%cat/var/local/sv/[Eメール保護]/サービス/実行
#!/空/ノッシュ
#./生成されたファイルの実行[Eメール保護]
#127.53.0.1のDNS/UDPソケット
udp-socket-listen --systemd-compatibility --combine4and6 127.53.0.1 ドメイン
コントロールグループ「../」に移動[Eメール保護]/[Eメール保護]
環境環境
envuidgid——tinydns-d
setlogin——tinydns-d
ハード制限-d 3000000
ソフト制限-dハード
。 /提供する
%

他のプロセス状態の変更はsystemdに固有ではありません。setenv(チェーンローディングツール)userenvまたは(チェーンmachineenvローディングツール)を使用して環境変数を設定し、(チェーンローディングツール)を使用するか、exportリソース制限を設定し、ファイル記述子を使用または開く、名前空間を使用し、予約優先ランクを使用できます。戦略などsoftlimitulimits6-softlimitredirfdfdredirunsharertpriochrtnumactl

LISTEN_FDS上記のように、systemdはこのプロトコルの唯一のスポークスマンではありません。繰り返しますが、これはプログラムの先頭に埋め込まれて接続される練習にすぎませんINVOCATION_ID。これらのどれも指標として信頼できません。env/INVOCATION_IDrunenvdir

概念エラー

によって開始されたプロセスを除外するトラップもありますcron。ここで概念的な欠陥は、これがcronサービスであり、これが生成されるプロセスであるということです。このサービスのコンテキストで実行されています。。持ついいえcronサービスのプロセスによって生成されたプロセスcronと、他のサービスの他のサービスプロセスによって生成されたプロセスとの間に魔法のような違いがあり、これは前者を後者とは多少異なってしまいます。

この概念的なエラーを取り除くと、答えが表示されます。デーモンは、自分が属する(POSIX)セッションに制御端末がないという点で異なります。その他すべてのログインセッションとの接続(set nameからsetloginsystemdのユーザースペースログインセッションメカニズムを介してさまざまなセキュリティコンテキストまで)セッションの制御端末が何であるかを照会するための移植可能な直接的な方法はありませんが、パブリック/dev/tty失敗は間接的な方法で使用できますあります。有望に見えるいくつかのCライブラリ関数は実際には実際には信頼できません。

追加読書

  • https://unix.stackexchange.com/a/398951/5132
  • https://unix.stackexchange.com/a/187540/5132
  • 制御端末の実際の名前を取得するには?
  • ツールセット:
    • s6。 Laurent Bercot.skarnet.org.
    • 実装する。 Laurent Bercot.skarnet.org.
    • ジョナサンデボインポラード(2018)。おやつ ソフトウェア。
  • 参考書:
    • export。ローランベルコ。 実装する。 skarnet.org.
    • redirfd。ローランベルコ。 実装する。 skarnet.org.
    • s6-softlimit。ローランベルコ。 s6。 skarnet.org.
    • CHPST.runit.smarden.org.
    • ジョナサンデボインポラード(2018)。service-managerスナックガイド。ソフトウェア。
    • ジョナサンデボインポラード(2018)。move-to-control-groupスナックガイド。ソフトウェア。
    • ジョナサンデボインポラード(2018)。setenvスナックガイド。ソフトウェア。
    • ジョナサンデボインポラード(2018)。softlimitスナックガイド。ソフトウェア。
    • ジョナサンデボインポラード(2018)。ulimitスナックガイド。ソフトウェア。
    • ジョナサンデボインポラード(2018)。fdredirスナックガイド。ソフトウェア。
    • ジョナサンデボインポラード(2018)。unshareスナックガイド。ソフトウェア。
    • ジョナサンデボインポラード(2018)。setloginスナックガイド。ソフトウェア。

おすすめ記事