在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

如何将这个脚本作为服务运行,而不会陷入“开始” / while true循环中?

Answers:


8

您需要让systemd为您工作。让它处理开始时的派生和进程的终止。例如,将您的服务零件替换为

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

那么你可以使用systemctl startstatusstop。您必须记住,shell 不会解释systemd中的行,因此,例如,您&;仅作为另一个2个字符的参数传递给脚本。


好的,谢谢,我做了更改。不幸的是,尝试像以前一样启动脚本时,脚本仍然挂起。
Flatron '16

1
你记得做过sudo systemctl daemon-reload吗?
meuh

您知道这些时刻,您认为自己已经做了某件事,尽管您没有做?谢谢!:)
Flatron

1

根据您的要求,您可能考虑用systemd计时器配置替换循环。即使server_send_message花费的时间超过“ OnUnitActiveSec”,它也不会启动两次服务:

脚本计时器

[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'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.