systemdスクリプトでtrueのときに実行


8

基本的にこれを実行しているbashスクリプトを取得しました。

#!/bin/bash

[...]

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

これをsystemdサービスとして実行したいのですが、サービススクリプトは次のようになります。

[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

「starting」/ while trueループに陥ることなく、このスクリプトをサービスとして実行するにはどうすればよいですか?

回答:


8

systemdを動作させる必要があります。開始時のforkとプロセスのkillを処理します。たとえば、サービス部品を

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

あなたが使用することができsystemctl startstatusそしてstop。あなたはsystemdにで行がされていることを覚えておく必要があり、NOT、シェルによって解釈ので、たとえば、あなたは、&;単にあなたのスクリプトに2つの文字の別のパラメータとして渡されます。


わかりましたありがとう、変更を行いました。残念ながら、以前と同様にスクリプトを起動しようとすると、スクリプトがハングします。
Flatron

1
覚えているsudo systemctl daemon-reload
16

あなたはこれらの瞬間を知っていますか?うまくいきました!:)
Flatron

1

要件に応じて、ループをsystemdタイマー設定に置き換えることを検討できます。server_send_messageに "OnUnitActiveSec"より長い時間がかかっても、サービスは2回開始されません。

somescript.timer

[Unit]
Description=Announce every minute

[Timer]
OnUnitActiveSec=1m
AccuracySec=10s
Unit=somescript.service

[Install]
WantedBy=default.target

somescript.serviceサービス部分:

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c 'str="broadcast "`randArrayElement "messages[@]"`; server_send_message $str'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.