Systemdはスクリプトを開始できませんか?


8

起動時に実行したいBASHスクリプトがあります。私のシステムはsystemdを実行しているので、必要な情報だと思うもので.serviceファイルを作成しました。

[Unit]
Description=My Script
After=network.target

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

systemctl enableを使用して「登録」し、再起動しました。ブート時に、スクリプトが実行されると言われましたが、スクリプトに記述した内容に従って、ECHOが画面に表示するメッセージを表示することも、ファイルに何かを書き込むこともできませんでした。さらに、起動するはずのアプリケーションは起動しません。

Systemctl statusは、スクリプトが正常に実行および終了したことを示しています。それでも、スクリプトは効果がありません。シェルからスクリプトを実行すると、問題なく動作します。

何が私の問題になりうるかご存知ですか?


3
どうやら、スクリプトが何か他のものを開始する場合、「Type = forking」が必要です。以前の設定をいじらないと少しバカになります。
TokyoMEWS

1
それを解決するための+1。ソリューションを回答として投稿し、それを受け入れて、同じ問題を抱えている他の人々を支援してください。
テルドン

1
@TokyoMEWS:より正確には、スクリプトが何かを開始し、その子の実行中に終了する場合、「Type = forking」が必要です。
-grawity

回答:


7

TokyoMEWSが自分で見つけたものに加えて...

どうやら、スクリプトが他の何かを開始する場合、「Type = forking」が必要です

(これは完全に正しいわけではありません- 子の実行中にType=forkingスクリプトが終了した場合にのみ必要になります)

...その他の考えられる問題は次のとおりです。

  1. 「画面に表示する」とは、スクリプトが単に標準出力に何かを書き込むことを意味すると推測しています。これはブート中に画面に移動しません。むしろ、サービスの標準出力のすべてがジャーナル(またはsystemdバージョンに応じてsyslog)に送信されます。

  2. あなたがいる場合でした実際に(例えば使用して、画面への書き込みをしようとしecho Hi >/dev/tty1)、それはときにスクリプトの出力が消える可能性が非常に高いのですagettyではは、ログインプロンプトを表示する前に画面をクリアします。(それを回避するには、ユニットを注文する必要がありますAfter=getty@tty1.service)。

  3. ファイルに何かを書き込むには、ファイルシステムを読み書き可能にマウントする必要があります。これにAfter=local-fs.target は、必要になる場合があります。ただし、これは特定のOS構成に依存します。


1

あなたのスクリプトが定義されている場合ExecStopのにも句を、あなたは「設定する必要がありRemainAfterExitは = yes」を避けるためにExecStopを後に自動的に呼び出されているExecStart。これにより、ExecStartコマンドの実行後、サービスのステータスが「アクティブ」になります。

[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.