私のアプリケーション用の起動/終了スクリプトを作成しようとしていますが、これについての経験がないので、画面(「test_screen」と呼びます)から始めましょう。
最初は/etc/init.dにスクリプトを生成すればいいと思いました。ここでインスピレーションを得ました -https://unix.stackexchange.com/a/20361/29677。
私のアプリケーションをモックするための基本的なアイデアは、以下を使用することです。
screen -d -m -S test_screen
始めるscreen -S test_screen -X quit
終了のため- そして
screen –list
(ある種の)状態
しかし、私が試し/etc/init.d/test_screen start
た場合
Reloading systemd: [ OK ]
Starting test_screen (via systemctl): Failed to start test_screen.service: Unit not found.
[FAILED]
だからユニットを作る必要があるようです。
私は前に試しましたhttps://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.htmlしたがって、私のユニットファイルは次の場所にあります/etc/systemd/system
。
# cat test_screen.service
[Unit]
Description=Testing `screen` service
[Service]
Type=simple
ExecStart=/bin/screen -d -m -S test_screen
ExecStop=/bin/screen -S test_screen -X quit
Environment=
Restart=always
[Install]
WantedBy=default.target
最初の質問は、私がそれを持っていなければならないのか/etc/init.d/test_screen start
、それとも持ってはExecStart
いけないのかということです。確かに同じ集団ではありません...
とにかく実行されません。/var/log/messages
私が見る前に
Sep 19 10:54:58 somehostname systemd: Started Testing `screen` service.
Sep 19 10:54:58 somehostname systemd: Starting Testing `screen` service...
Sep 19 10:54:58 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:58 somehostname systemd: Started Testing `screen` service.
Sep 19 10:54:58 somehostname systemd: Starting Testing `screen` service...
Sep 19 10:54:58 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:58 somehostname systemd: Started Testing `screen` service.
Sep 19 10:54:58 somehostname systemd: Starting Testing `screen` service...
Sep 19 10:54:59 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:59 somehostname systemd: Started Testing `screen` service.
Sep 19 10:54:59 somehostname systemd: Starting Testing `screen` service...
Sep 19 10:54:59 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:59 somehostname systemd: Started Testing `screen` service.
Sep 19 10:54:59 somehostname systemd: Starting Testing `screen` service...
Sep 19 10:54:59 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:59 somehostname systemd: start request repeated too quickly for test_screen.service
Sep 19 10:54:59 somehostname systemd: Failed to start Testing `screen` service.
Sep 19 10:54:59 somehostname systemd: Unit test_screen.service entered failed state.
Sep 19 10:54:59 somehostname systemd: test_screen.service failed.
失敗した状態になった理由をどのように見つけることができますか?すべての提案を歓迎します。
答え1
解決したようですねscreen
…
まず、パラメータを削除しましたRestart=always
。
動作させるにはRemainAfterExit=True
。
以前のinitスクリプトを使用すると、コードの場所が明確になります。残りのコードを置く正しい場所を実際にはわかりません。単にから私のスクリプトを呼び出す必要がありますかExecStart=
?
学びながらさらに発見した事項です。
状態
良い質問があります(私も興味があることを意味します)。ヘルスチェックを実装する方法について説明します。システムカスタムステータスメッセージ?
短い答えは、それが(とにかく)基本的に動作するということです =あまり気にする必要はありません。
だから私はtest_screenサービスのために呼び出すsystemctl status test_screen.service
ことができます。
● test_screen.service - Testing `screen` service
Loaded: loaded (/etc/systemd/system/test_screen.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2017-09-20 12:48:34 CEST; 1s ago
Process: 36633 ExecStart=/bin/screen -d -m -S test_screen (code=exited, status=0/SUCCESS)
Main PID: 36634 (screen)
CGroup: /system.slice/test_screen.service
├─36634 /bin/SCREEN -d -m -S test_screen
└─36635 /bin/sh
Sep 20 12:48:34 somehostname systemd[1]: Starting Testing `screen` service...
Sep 20 12:48:34 somehostname systemd[1]: Started Testing `screen` service.
...異常に停止すると、状態は失敗します。
● test_screen.service - Testing `screen` service
Loaded: loaded (/etc/systemd/system/test_screen.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2017-09-20 12:51:00 CEST; 1s ago
Process: 36805 ExecStop=/bin/screen -S test_screen -X quit (code=exited, status=0/SUCCESS)
Process: 36633 ExecStart=/bin/screen -d -m -S test_screen (code=exited, status=0/SUCCESS)
Main PID: 36634 (code=exited, status=1/FAILURE)
Sep 20 12:48:34 somehostname systemd[1]: Starting Testing `screen` service...
Sep 20 12:48:34 somehostname systemd[1]: Started Testing `screen` service.
Sep 20 12:51:00 somehostname systemd[1]: Stopping Testing `screen` service...
Sep 20 12:51:00 somehostname systemd[1]: test_screen.service: main process exited, code=exited, status=1/FAILURE
Sep 20 12:51:00 somehostname systemd[1]: Stopped Testing `screen` service.
Sep 20 12:51:00 somehostname systemd[1]: Unit test_screen.service entered failed state.
Sep 20 12:51:00 somehostname systemd[1]: test_screen.service failed.
私が経験しなければならなかった問題を克服しましたRemainAfterExit=True
(提案を試みType=forking
、オプションに注釈を付けたのでRemainAfterExit
)。
リストユニットファイル
今は再現できない問題に封着しました。試してみると、systemctl start
「単位ファイルなし」などのレスポンスが出てくるので、どういうわけか登録する必要があるかどうか疑問に思います。
いいえ、そうする必要はありません。実行できsystemctl list-unit-files --type=service
、そこからユニットを見ることができます。私の問題は、ExecStart
パラメータが間違っていることです。今同じ作業を試してみると、メッセージを理解しやすくなります。
$ systemctl start test_screen.service
Job for test_screen.service failed because the control process exited with error code. See "systemctl status test_screen.service" and "journalctl -xe" for details.
$ systemctl status test_screen.service
● test_screen.service - Testing `screen` service
Loaded: loaded (/etc/systemd/system/test_screen.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2017-09-20 12:55:53 CEST; 1min 3s ago
Process: 37344 ExecStart=/bin/screen2 -d -m -S test_screen (code=exited, status=203/EXEC)
Main PID: 36634 (code=exited, status=1/FAILURE)
Sep 20 12:55:53 somehostname systemd[1]: Starting Testing `screen` service...
Sep 20 12:55:53 somehostname systemd[37344]: Failed at step EXEC spawning /bin/screen2: No such file or directory
Sep 20 12:55:53 somehostname systemd[1]: test_screen.service: control process exited, code=exited status=203
Sep 20 12:55:53 somehostname systemd[1]: Failed to start Testing `screen` service.
Sep 20 12:55:53 somehostname systemd[1]: Unit test_screen.service entered failed state.
Sep 20 12:55:53 somehostname systemd[1]: test_screen.service failed.
スクリプトの実行
スクリプトを呼び出すためにtest_screenを修正してみました。
$ cat /etc/systemd/system/test_screen_script.service
[Unit]
Description=Testing `screen` service
[Service]
Type=forking
ExecStart=/root/test_screen_start.sh
ExecStop=/root/test_screen_stop.sh
#Environment=
#Restart=always
RemainAfterExit=True
[Install]
WantedBy=default.target
そしてスクリプトは単に古い呼び出しのラッパーです。
$ cat /root/test_screen_start.sh
/bin/screen -d -m -S test_screen
$ cat /root/test_screen_stop.sh
/bin/screen -S test_screen -X quit
これは開始されません。
$ systemctl start test_screen_script
Job for test_screen_script.service failed because the control process exited with error code. See "systemctl status test_screen_script.service" and "journalctl -xe" for details.
$ systemctl status test_screen_script.service
● test_screen_script.service - Testing `screen` service
Loaded: loaded (/etc/systemd/system/test_screen_script.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2017-09-20 15:47:59 CEST; 8s ago
Process: 63582 ExecStart=/root/test_screen_start.sh (code=exited, status=203/EXEC)
Main PID: 60698 (code=exited, status=0/SUCCESS)
Sep 20 15:47:59 somehostname systemd[1]: Starting Testing `screen` service...
Sep 20 15:47:59 somehostname systemd[63582]: Failed at step EXEC spawning /root/test_screen_start.sh: Exec format error
Sep 20 15:47:59 somehostname systemd[1]: test_screen_script.service: control process exited, code=exited status=203
Sep 20 15:47:59 somehostname systemd[1]: Failed to start Testing `screen` service.
Sep 20 15:47:59 somehostname systemd[1]: Unit test_screen_script.service entered failed state.
Sep 20 15:47:59 somehostname systemd[1]: test_screen_script.service failed.
誰かが理由を説明できればいいでしょう。この問題に対する解決策はを追加することです#!/bin/bash
。
引用する
- 私がここで見つけたもの
list-unit-files
:https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units