
コンソールアプリケーションであるsystemdサービスがあります。つまり、stdinにコマンドを送信し、情報をsdoutに出力することで制御されます。いつでも標準入力に接続し、コマンドを発行できるように systemd サービスを設定し、必要に応じて切り離して反復できるようにするにはどうすればよいですか?
答え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
上記の簡単なサービスでは、次のオプションが使用されます。
構成(リモートで)テキストモード仮想コンソールを制御します。これはおそらく最善の選択です(上記のttyサービスを使用)。ほとんどの拡張パックリポジトリから利用でき、次のように使いやすいです。
conspy 20 # hit ESC+ESC+ESC (3 times quickly, to exit)
シフト/dev/ttyNのように動作します
conspy
が、/dev/ttyNをフロント(ローカル)端末にします。それの一部です知識ベースほとんどすべての最新のLinuxディストリビューションにデフォルトで収集されインストールされます。だからこそ言及する価値があると思います。主な注意点chvt
は、付属のキーボードを使用する必要があることです。これは必要なものと異なる場合があります。上記のサービス例では、chvt
次のように使用できます。chvt 20 # ALT+F1 to return to /dev/tty1
レプテルシステムコールを使用して
ptrace(2)
PIDを介してリモートプログラムに接続します。これはconspy
& とはまったく異なるアプローチですが、上記chvt
のサービス定義にも当てはまります。reptyr
実際に「分離」自体をサポートしていないことに注意してください。 termcapのサポートもそれほど強力ではありません。一般reptyr
的に画面そして/またはマルチプレクサこれはより円滑な「分離」方法を提供するので、既存のPIDをセッション、ウィンドウ、またはペインreptyr
に移動するための優れたニッチツールだと思います。screen
tmux
つまり、このオプションは最後ですが、ここに入れました。なぜなら、このオプションはor
reptyr
なしで使用できるからです。主な注意点は、プロセスを別のシェルを介して別のtty / ptyにコピーするのではなく、プロセスを中断する場合(例:^ C)です。プロセスに割り込みを送信すると、プロセスが中断される可能性があります。残りは皆さんもご存じでしょう。screen
tmux
たぶん大丈夫かもしれません。特に、プロセスが重要ではなく、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>
別の(より複雑な[より多くの失敗の可能性を意味する])アプローチは、画面を使用して次の分岐サービスを作成することです。
# /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
を使用するよりもうまく機能することを意味しますreptyr
。screen
ほとんど合格できる~によるとパッケージストアで、次のように使用できます。screen -r systemd-interactive # CTRL-A+D to detach
画面をフォークするのと同様の方法はフォークです
tmux
。 systemdサービスはtmux
systemdサービスとほぼ同じですscreen
。しかし、時間が遅くて疲れているので、これについては詳しく説明しません。ええ、私は使っています。tmux
たくさんscreen
(最近)以上。実際、私は
tmux
今ネオビームウィンドウでこの記事を書いています。それにもかかわらず、私はそれをscreen
長い間使用しました。私の経験と意見では、tmux
このようなものは少し過剰です。もちろん、tmux
より新しく、より多くの機能を持ち、より良いシェルマルチプレクサですがscreen
...はるかに複雑です。追加の複雑さにより、さらなる不安定性が生じる。さらに、少なくとも私にとっては、
tmux
クラッシュは画面よりも頻繁に発生します。私はスクリーンを#2としてリストしました。なぜなら、それが私の場合、似たようなものについておそらく#1と比較するでしょうconspy
。計画によって異なります。名前付きパイプ…systemdサービスもこれをサポートします!つまり
StandardInput=/path/to/named/pipe|
...そしてもっと。
答え2
私のためのより簡単なスクリーンソリューション:
場所:
/home/someUser/.config/systemd/user/some.service
コンテンツ:
[Unit]
Description=someServer
Wants=network.target
After=network.target
[Service]
ExecStart=screen -S screenName -D -m /home/someUser/startServer.sh
[Install]
WantedBy=default.target