기본적으로 이것을 실행하는 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자 인수로 전달하면 됩니다.
답변2
요구 사항에 따라 루프를 시스템 타이머 구성으로 교체하는 것을 고려할 수 있습니다. 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'