問題は、systemd
2番目のリモートシステムでサービスを開始できますか?です。
想像する:
アプリケーション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.service
2台目のコンピュータを初期化するにはどうすればよいですか?可能ですか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
[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
リモートプロセスが実行されていることがわかります。端末に表示する必要がありますstdout
。stderr
アプリで許可すると、stdin
ここでも利用できます。ローカルでシャットダウンするnetcat
と、リモートサービスが停止していることがわかります。満足のいく場合は、ソケットを有効にしてリモートシステムで次のコマンドを実行して起動し、リスニングを開始します。
systemctl enable remote.socket
最後に、それらを一つにまとめる。
systemctl start local.sevice
リモートサービスが実行されている必要があります。
systemctl stop local.servce
リモートサービスを停止する必要があります。
これで、リモートサービスをトリガーしたいRequires=
WantedBy=
PartOf=
関係を追加できます。local.service