サービスの開始後、systemdはstdin / stdoutに接続します。

サービスの開始後、systemdはstdin / stdoutに接続します。

コンソールアプリケーションであるsystemdサービスがあります。つまり、stdinにコマンドを送信し、情報をsdoutに出力することで制御されます。いつでも標準入力に接続し、コマンドを発行できるように systemd サービスを設定し、必要に応じて切り離して反復できるようにするにはどうすればよいですか?

ベストアンサー1

これを行ういくつかの方法を考えることができます。もちろん、それぞれに固有の注意事項があります。

  1. 最も簡単なアプローチは、おそらく次のように専用のttyを使用して単純なサービスを作成することです。

    # /etc/systemd/system/systemd-interactive-simple-tty.service
    
    [Unit]
    Description=Example systemd interactive simple tty service
    After=getty.service
    
    [Service]
    # https://www.freedesktop.org/software/systemd/man/systemd.exec.html
    ExecStart=/usr/local/sbin/systemd-interactive.bash
    StandardInput=tty-force
    TTYVHangup=yes
    TTYPath=/dev/tty20
    TTYReset=yes
    # https://www.freedesktop.org/software/systemd/man/systemd.service.html
    Type=simple
    RemainAfterExit=false
    Restart=always
    RestartSec=5s
    
    [Install]
    WantedBy=default.target
    

    上記の簡単なサービスでは、次のオプションが使用されます。

    1. 構成(リモートで)テキストモード仮想コンソールを制御します。これはおそらく最善の選択です(上記のttyサービスを使用)。ほとんどの拡張パックリポジトリから利用でき、次のように使いやすいです。

       conspy 20 # hit ESC+ESC+ESC (3 times quickly, to exit)
      
    2. シフト/dev/ttyNのように動作しますconspyが、/dev/ttyNをフロント(ローカル)端末にします。それの一部です知識ベースほとんどすべての最新のLinuxディストリビューションにデフォルトで収集されインストールされます。だからこそ言及する価値があると思います。主な注意点chvtは、付属のキーボードを使用する必要があることです。これは必要なものと異なる場合があります。上記のサービス例では、chvt次のように使用できます。

       chvt 20 # ALT+F1 to return to /dev/tty1
      
    3. レプテルシステムコールを使用してptrace(2)PIDを介してリモートプログラムに接続します。これはconspy& とはまったく異なるアプローチですが、上記chvtのサービス定義にも当てはまります。

      reptyr実際に「分離」自体をサポートしていないことに注意してください。 termcapのサポートもそれほど強力ではありません。一般reptyr的に画面そして/またはマルチプレクサこれはより円滑な「分離」方法を提供するので、既存のPIDをセッション、ウィンドウ、またはペインreptyrに移動するための優れたニッチツールだと思います。screentmux

      つまり、このオプションは最後ですが、ここに入れました。なぜなら、このオプションはorreptyrなしで使用できるからです。主な注意点は、プロセスを別のシェルを介して別のtty / ptyにコピーするのではなく、プロセスを中断する場合(例:^ C)です。プロセスに割り込みを送信すると、プロセスが中断される可能性があります。残りは皆さんもご存じでしょう。screentmux

      たぶん大丈夫かもしれません。特に、プロセスが重要ではなく、systemdサービスが上記Restart=alwaysのように構成されている場合は、そうです。プロセスが「中断」すると、systemdは自動的にプロセスを再起動します(systemdのもう1つの素晴らしい機能!)。また、他の値もありますRestart。 YMMV。

      reptyr次のように、ほとんどの拡張パックストアで利用可能で利用可能です。

       reptyr $(systemctl status systemd-interactive-simple-tty.service | grep Main\ PID | awk '{print $3}') # or just reptyr <pid>
      
  2. 別の(より複雑な[より多くの失敗の可能性を意味する])アプローチは、画面を使用して次の分岐サービスを作成することです。

    # /etc/systemd/system/systemd-interactive-forking-screen.service
    
    [Unit]
    Description=Example systemd interactive forking screen service
    
    [Service]
    # https://www.freedesktop.org/software/systemd/man/systemd.exec.html
    ExecStartPre=-/usr/bin/screen -X -S ${SCREEN_TITLE} kill # [optional] prevent multiple screens with the same name
    ExecStart=/usr/bin/screen -dmS ${SCREEN_TITLE} -O -l /usr/bin/bash -c /usr/local/sbin/systemd-interactive.bash
    # https://www.freedesktop.org/software/systemd/man/systemd.service.html
    Type=forking
    Environment=SCREEN_TITLE=systemd-interactive
    RemainAfterExit=false
    Restart=always
    RestartSec=5s
    SuccessExitStatus=1
    
    [Install]
    WantedBy=default.target
    

    画面複数のプロセスで物理端末を再利用するフルスクリーンウィンドウマネージャです。最初の簡単なオプションにリストされているよりもはるかに複雑です。個人的には、私は長い間画面を使用しており、ほとんどのことで画面を信頼できるほど快適に感じます。これは非常に貴重なツールです。

    上記の最大の利点は良いtermcapサポートです(tmuxほど良くありませんが)。これは、バックスペースキー、矢印などがまたはconspyを使用するよりもうまく機能することを意味しますreptyrscreenほとんど合格できる~によるとパッケージストアで、次のように使用できます。

    screen -r systemd-interactive # CTRL-A+D to detach
    
  3. 画面をフォークするのと同様の方法はフォークですtmux。 systemdサービスはtmuxsystemdサービスとほぼ同じですscreen。しかし、時間が遅くて疲れているので、これについては詳しく説明しません。ええ、私は使っています。tmux たくさんscreen(最近)以上。

    実際、私はtmux今ネオビームウィンドウでこの記事を書いています。それにもかかわらず、私はそれをscreen長い間使用しました。私の経験と意見では、tmuxこのようなものは少し過剰です。もちろん、tmuxより新しく、より多くの機能を持ち、より良いシェルマルチプレクサですがscreen...はるかに複雑です。追加の複雑さにより、さらなる不安定性が生じる。

    さらに、少なくとも私にとっては、tmuxクラッシュは画面よりも頻繁に発生します。私はスクリーンを#2としてリストしました。なぜなら、それが私の場合、似たようなものについておそらく#1と比較するでしょうconspy

  4. 計画によって異なります。名前付きパイプ…systemdサービスもこれをサポートします!つまり

    StandardInput=/path/to/named/pipe|
    

...そしてもっと。

おすすめ記事