systemdスクリプトでtrueの場合は実行

systemdスクリプトでtrueの場合は実行

基本的にこれを実行するbashスクリプトがあります。

#!/bin/bash

[...]

 while true; do
         str="broadcast "`randArrayElement "messages[@]"`
         server_send_message $str
         sleep $interval
 done

今システムサービスとして実行したいと思います。サービススクリプトは次のとおりです。

[Unit]
Description=Announcer
After=network.target

[Service]
ExecStart=/usr/local/bin/somescript &; disown
ExecStop=/usr/bin/kill -9 `cat /tmp/somescript.pid`
Type=forking
PIDFile=/tmp/somescript.pid

[Install]
WantedBy=default.target

残念ながらservice somescript start、サービスを実行すると動作しますが、while trueループが原因で端末が起動スクリプトに停止しました。

● somescript.service - somescript service
   Loaded: loaded (/etc/systemd/system/somescript.service; disabled; vendor preset: enabled)
   Active: activating (start) since Wed 2016-08-17 12:22:34 CEST; 43s ago
  Control: 17395 (somescript)
   CGroup: /system.slice/somescript.service
           ├─17395 /bin/bash /usr/local/bin/somescript &; disown
           └─17409 sleep 600

「開始」/while true ループに閉じ込めずにこのスクリプトをサービスとして実行するにはどうすればよいですか?

ベストアンサー1

systemdが機能するようにする必要があります。プロセスの開始と終了時に分岐を処理するようにします。たとえば、修理部品を次のように交換します。

[Service]
Type=simple
ExecStart=/usr/local/bin/somescript
PIDFile=/tmp/somescript.pid

systemctl startその後、statusおよびを使用できますstop。 systemdの行は次のようになることを覚えておく必要があります。いいえシェルによって解釈されるので、たとえば&;スクリプトに別の2文字引数として渡すことができます。

おすすめ記事