再起動時に画面を実行するようにsystemdサービスを設定中に問題が発生しました。

再起動時に画面を実行するようにsystemdサービスを設定中に問題が発生しました。

SSH経由でのみアクセスできるCentOS 7を実行しているリモートサーバーがあります。 ISPが再起動された後も、両方のJavaサーバーが常に実行されることを望みます。

そこで、画面から2つのJavaサーバーを起動するシステムサービスを作成してみました。サービスを開始するとエラーメッセージは表示されませんが、すぐに消えます。 (systemctl status -l blogpatcher.service)

    * blogpatcher.service - Start blogpatcher servers
Loaded: loaded (/etc/systemd/system/blogpatcher.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Sat 2020-02-08 04:19:09 EST; 7s ago
Process: 22388 ExecStart=/usr/bin/bash /home/blogpatc/script/blogpatcher.sh (code=exited, status=0/SUCCESS)
Main PID: 22388 (code=exited, status=0/SUCCESS)

これは blogpatcher.service ファイルです:

# vi /etc/systemd/system/blogpatcher.service

[Unit]

Description=Start blogpatcher servers

After=network.target


[Service]

Type=simple

ExecStart=/usr/bin/bash /home/blogpatc/script/blogpatcher.sh

TimeoutStartSec=90


[Install]

WantedBy=default.target

以下は、サービスが実行されるスクリプトファイルです。

# vi /var/tmp/test_script.sh
#!/bin/bash
screen -dmS syn bash -c 'cd /home/blogpatc/server/;java -cp bloghelper_artifact_main.jar com.aperico.bloghelper.server.ThesaurusServer;exec bash'

SSHコンソールでスクリプトファイルを実行すると、期待どおりに動作しますが、エラーメッセージがないため、少し混乱し、問題が何であるかを知っている人がいるかどうか疑問に思います.

答え1

[Service]セクションの下に「RemainAfterExit = yes」を追加すると、画面は開いたままになります。

答え2

問題はおそらくexec bash最後に来るようです。入力を受け取らずにbash終了します。シェルを実行すると同じことが起こります。入力が残らないため、シェルは終了します。

しかし、より基本的に:なぜ使用するのですかscreen?これにはどんな利点がありますか?

systemdに再起動をさせると、何が起こりますか?

[Unit]
Description=Start blogpatcher server  
After=network.target

[Service]   
Type=simple
ExecStart=/usr/bin/bash /home/blogpatc/script/blogpatcher.sh
TimeoutStartSec=90
Restart=always
RestartSec=10

[Install]
WantedBy=default.target

そして

#!/bin/bash
cd /home/blogpatc/server/
java -cp bloghelper_artifact_main.jar com.aperico.bloghelper.server.ThesaurusServer

Systemdには多くの追加パラメータと可能性があるため、これについて読むことをお勧めします。たとえば、スクリプトが作業ディレクトリを設定するためにのみ使用されている場合(私が想定しているように、より複雑な起動スクリプトの開始として使用されていない場合)、コメントに提案されているWorkingDirectoryようにJdeBPを調べることをお勧めします。

起動スクリプトでそれを使用しようとすると、screenユニットファイルのサービスセクションはおそらく次のようになります。

[Service]
Type=simple
Restart=on-failure
WorkingDirectory=/home/blogpatc/server/
RestartSec=3
ExecStart=/usr/bin/screen -L -dm java -cp bloghelper_artifact_main.jar com.aperico.bloghelper.server.ThesaurusServer

または代わりType=forkingにナビゲートしてみてくださいType=simple

答え3

execscreenの前にコマンドを追加して、bashプロセスをscreenプロセスに置き換えることができます。これにより、systemctl画面プロセスが終了したタイミングを識別し、再起動ポリシーメカニズムを使用して再起動できます。変更されたスクリプトは次のとおりです。

# vi /var/tmp/test_script.sh
#!/bin/bash
exec screen -dmS syn bash -c 'cd /home/blogpatc/server/;java -cp bloghelper_artifact_main.jar com.aperico.bloghelper.server.ThesaurusServer;exec bash'

再起動ポリシーを指定する方法は次のとおりです。

[Service]
# ...
Restart=always

関連情報