Я получил 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
Как я могу запустить этот скрипт как сервис, не застревая в цикле «запуск» / while true?
bash
shell-script
systemd
Flatron
источник
источник
sudo systemctl daemon-reload
?В зависимости от ваших требований вы можете подумать о замене цикла на конфигурацию системного таймера. Он не запустит службу дважды, даже если server_send_message займет больше времени, чем «OnUnitActiveSec»:
somescript.timer
somescript.service Сервисная часть:
источник