Noether
19.08.15, 21:38
Ich möchte das ein Skript beim Booten gestartet wird und ständig läuft, also neu gestartet wird wenn es terminiert und dazu habe ich dieses Beispiel als Anfang gemacht:
#!/bin/bash
# file /root/bin/foo.sh
LOGFILE="/root/tmp/foo0.txt"
PIDFILE=/run/foo.pid
echo $$ > $PIDFILE
#echo $BASHPID > $PIDFILE
echo number of arguments: $# >> $LOGFILE
for var in "$@"
do
echo "$var" >> $LOGFILE
done
while true
do
date >> $LOGFILE
sleep 12
done
exit 0
# file /etc/systemd/system/foo.service, use "systemd-analyze verify foo.service" to verify, enable via "systemctl enable foo.service"
[Unit]
Description=Logger Service
# start after syslog
After=syslog.target
[Service]
ExecStart=/bin/bash /root/bin/foo.sh
Type=forking
# at termination: Send sigterm to the process and childs
KillMode=mixed
# respawn
Restart=always
PIDFile=/run/foo.pid
User=root
Group=root
RemainAfterExit=yes
# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=2
[Install]
# start on runlevel [2345]
WantedBy=multi-user.target
Aber das funktioniert nicht ganz:
> systemctl start foo.service
Job for foo.service failed because a timeout was exceeded. See "systemctl status foo.service" and "journalctl -xe" for details.
Und das Skript wird alle zwei Sekunden terminiert und neu gestartet, wie die Log-Datei zeigt:
number of arguments: 0
Mi 19. Aug 20:30:29 UTC 2015
number of arguments: 0
Mi 19. Aug 20:30:32 UTC 2015
number of arguments: 0
Mi 19. Aug 20:30:34 UTC 2015
number of arguments: 0
Mi 19. Aug 20:30:37 UTC 2015
Wieso killt systemd das Skript? :confused:
Von allein terminiert das Skript nicht; es bleibt in der while-Schleife und schreibt alle 12 Sekunden die Zeit in die Logdatei.
#!/bin/bash
# file /root/bin/foo.sh
LOGFILE="/root/tmp/foo0.txt"
PIDFILE=/run/foo.pid
echo $$ > $PIDFILE
#echo $BASHPID > $PIDFILE
echo number of arguments: $# >> $LOGFILE
for var in "$@"
do
echo "$var" >> $LOGFILE
done
while true
do
date >> $LOGFILE
sleep 12
done
exit 0
# file /etc/systemd/system/foo.service, use "systemd-analyze verify foo.service" to verify, enable via "systemctl enable foo.service"
[Unit]
Description=Logger Service
# start after syslog
After=syslog.target
[Service]
ExecStart=/bin/bash /root/bin/foo.sh
Type=forking
# at termination: Send sigterm to the process and childs
KillMode=mixed
# respawn
Restart=always
PIDFile=/run/foo.pid
User=root
Group=root
RemainAfterExit=yes
# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=2
[Install]
# start on runlevel [2345]
WantedBy=multi-user.target
Aber das funktioniert nicht ganz:
> systemctl start foo.service
Job for foo.service failed because a timeout was exceeded. See "systemctl status foo.service" and "journalctl -xe" for details.
Und das Skript wird alle zwei Sekunden terminiert und neu gestartet, wie die Log-Datei zeigt:
number of arguments: 0
Mi 19. Aug 20:30:29 UTC 2015
number of arguments: 0
Mi 19. Aug 20:30:32 UTC 2015
number of arguments: 0
Mi 19. Aug 20:30:34 UTC 2015
number of arguments: 0
Mi 19. Aug 20:30:37 UTC 2015
Wieso killt systemd das Skript? :confused:
Von allein terminiert das Skript nicht; es bleibt in der while-Schleife und schreibt alle 12 Sekunden die Zeit in die Logdatei.