systemdを使用してリモートの2番目のシステムでアプリケーションを起動する方法

systemdを使用してリモートの2番目のシステムでアプリケーションを起動する方法

問題は、systemd2番目のリモートシステムでサービスを開始できますか?です。

想像する:

アプリケーション3X名は、app1 app2 app3マシン2X名と呼びます。 ms1とms2と呼びます。

----MS1---------MS2
----app1--------app3
----app2------------

同様のサービスを作成しました。

アプリケーションサービス

[Unit]
Description=Application
[Service]
# The dummy program will exit
Type=oneshot
# Execute a dummy program
ExecStart=/bin/true
# This service shall be considered active after start
RemainAfterExit=yes
[Install]
# Components of this application should be started at boot time
WantedBy=multi-user.target 

申請1.サービス

[Unit]
Description=Application Component 1
# When systemd stops or restarts the app.service, the action is propagated to this unit
PartOf=app.service
# Start this unit after the app.service start
After=app.service
[Service]
# Pretend that the component is running
ExecStart=/bin/sleep infinity
# Restart the service on non-zero exit code when terminated by a signal other than SIGHUP, SIGINT, SIGTERM or SIGPIPE
Restart=on-failure
[Install]
# This unit should start when app.service is starting
WantedBy=app.service

アプリケーション2.サービス

[Unit]
Description=Application Component 2
PartOf=app.service
After=app.service
[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure
[Install]
WantedBy=app.service

アプリケーション3.サービス

[Unit]
Description=Application Component 3
PartOf=app.service
After=app.service
# This unit should start after the app-component2 started
After=app-component2.service
[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure
[Install]
WantedBy=app.service

app3.service2台目のコンピュータを初期化するにはどうすればよいですか?可能ですかsystemd、それともスクリプトが必要ですか?

答え1

~によるとhttps://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html-single/system_administrators_guide/index#sect-Managing_Services_with_systemd-Remote(更新されたリンク)実際にこれを行うことができますが、試したことはありません。 SSHベースなので、ファイルでどのように使用するのかapp3.serviceわかりませんssh -i /path/to/ssh_key user@host systemctl start real_service

答え2

netcatソケットを介して開始されるリモートサービスをトリガーするために開始されたローカルサービスを使用してこれを達成します。

local.service:

[Unit]
Description=Local control of a remote service

[Service]
Type=simple
ExecStart=/bin/nc remote-machine remote-port
StandardOutput=journal
StandardError=journal
SuccessExitStatus=1

remote.socket:

[Unit]
Description=Socket for allowing remote control of our service

[Socket]
ListenStream=listen-port
Accept=yes

[Install]
WantedBy=sockets.target

[email protected]:

[Unit]
Description=A service running on another machine
Requires=remote.socket

[Service]
Type=simple
ExecStart=/path/to/application
StandardInput=socket
StandardOutput=socket
StandardError=socket

local.serviceメインコンピュータにインストールされます。このタスクを削除するコンピュータにremote.socketインストールします。[email protected]リモートコンピュータから聞き始める

systemctl start remote.socket

ローカルコンピュータでテストします(remote-ipおよび代替remote-port)。

netcat remote-machine-ip  remote-port

リモートプロセスが実行されていることがわかります。端末に表示する必要がありますstdoutstderrアプリで許可すると、stdinここでも利用できます。ローカルでシャットダウンするnetcatと、リモートサービスが停止していることがわかります。満足のいく場合は、ソケットを有効にしてリモートシステムで次のコマンドを実行して起動し、リスニングを開始します。

systemctl enable remote.socket

最後に、それらを一つにまとめる。

systemctl start local.sevice

リモートサービスが実行されている必要があります。

systemctl stop local.servce

リモートサービスを停止する必要があります。

これで、リモートサービスをトリガーしたいRequires= WantedBy= PartOf=関係を追加できます。local.service

関連情報