基本的にこれを実行する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文字引数として渡すことができます。