systemd 스크립트에서 true인 경우 실행

systemd 스크립트에서 true인 경우 실행

기본적으로 이것을 실행하는 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'

관련 정보