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
exec
screenの前にコマンドを追加して、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