2016-08-05 58 views
3

Ich habe ein einfaches Skript "start.sh", die ich es jedes Mal automatisch starten möchten, wenn Ubuntu 16.04 neu startet.Verwenden Sie Systemd, um ein Skript bei Ubuntu starten 16.04 Boot

Ich folgte diesem Beitrag: https://serverfault.com/questions/773162/i-cant-get-the-right-items-to-boot-on-ubuntu-16-04-and-systemd

Und dieses einfache Skript machen: https://github.com/kenpeter/test_run_at_boot

ich es hier setzen.

/lib/systemd/system/test_run_at_boot.service 

Ich habe es

verknüpft
/etc/systemd/system/multi-user.target.wants/test_run_at_boot.service -> /lib/systemd/system/test_run_at_boot.service 

Jedes Mal, wenn ich meine Maschine neu starten, wird es nicht an den Start.

Ich versuche auch, den tatsächlichen Befehl an test_run_at_boot.service anzuhängen, immer noch nicht funktioniert.

[Unit] 
Description=test_run_at_boot 

[Service] 
ExecStart=forever start -a -l forever.log -o out.log -e err.log /home/ubuntu/misc/service/test_run_at_boot/test_run_at_boot.js 

[Install] 
WantedBy=multi-user.target 

aktualisieren

In syslog, bekam ich diese. /usr/bin/env: ‘node’: No such file or directory Dies führt dazu, dass das Skript beim Start fehlschlägt.

Aug 5 06:45:23 xyz start.sh[1557]: /usr/bin/env: ‘node’: No such file or directory 
Aug 5 06:45:23 xyz systemd[1]: Starting LSB: Record successful boot for GRUB... 
Aug 5 06:45:23 xyz acpid: starting up with netlink and the input layer 
Aug 5 06:45:23 xyz acpid: 1 rule loaded 
Aug 5 06:45:23 xyz acpid: waiting for events: event logging is off 
Aug 5 06:45:23 xyz systemd[1]: Started D-Bus System Message Bus. 
Aug 5 06:45:23 xyz dbus[1590]: [system] AppArmor D-Bus mediation is enabled 
Aug 5 06:45:23 xyz systemd[1]: Started Cgroup management daemon. 
Aug 5 06:45:23 xyz systemd[1]: Starting Thermal Daemon Service... 
Aug 5 06:45:23 xyz systemd[1]: Started FUSE filesystem for LXC. 
Aug 5 06:45:23 xyz systemd[1]: Starting Restore /etc/resolv.conf if the system crashed before the ppp link was shut down... 
Aug 5 06:45:23 xyz lxcfs[1624]: hierarchies: 0: memory 
Aug 5 06:45:23 xyz lxcfs[1624]: 1: blkio 
Aug 5 06:45:23 xyz lxcfs[1624]: 2: hugetlb 
Aug 5 06:45:23 xyz lxcfs[1624]: 3: cpuset 
Aug 5 06:45:23 xyz lxcfs[1624]: 4: freezer 
Aug 5 06:45:23 xyz lxcfs[1624]: 5: net_cls,net_prio 
Aug 5 06:45:23 xyz lxcfs[1624]: 6: pids 
Aug 5 06:45:23 xyz lxcfs[1624]: 7: devices 
Aug 5 06:45:23 xyz lxcfs[1624]: 8: cpu,cpuacct 
Aug 5 06:45:23 xyz lxcfs[1624]: 9: perf_event 
Aug 5 06:45:23 xyz lxcfs[1624]: 10: name=systemd 
Aug 5 06:45:23 xyz systemd[1]: Starting System Logging Service... 
Aug 5 06:45:23 xyz systemd[1]: Started Snappy daemon. 
Aug 5 06:45:23 xyz systemd[1]: Started Regular background program processing daemon. 
Aug 5 06:45:23 xyz cron[1648]: (CRON) INFO (pidfile fd = 3) 
Aug 5 06:45:23 xyz systemd[1]: Starting Accounts Service... 
Aug 5 06:45:23 xyz cron[1648]: (CRON) INFO (Running @reboot jobs) 
Aug 5 06:45:23 xyz systemd[1]: Starting Login Service... 
Aug 5 06:45:23 xyz systemd[1]: Starting LXD - container startup/shutdown... 
Aug 5 06:45:23 xyz systemd[1]: Started System Logging Service. 
Aug 5 06:45:23 xyz systemd[1]: test_run_at_boot.service: Main process exited, code=exited, status=127/n/a 
Aug 5 06:45:23 xyz systemd[1]: test_run_at_boot.service: Unit entered failed state. 
Aug 5 06:45:23 xyz systemd[1]: test_run_at_boot.service: Failed with result 'exit-code'. 

aktualisiert 1

Ich folge diesem Beitrag

https://patrakov.blogspot.com.au/2011/01/writing-systemd-service-files.html

ich einige Änderungen vorgenommen

https://github.com/kenpeter/test_run_at_boot/blob/master/test_run_at_boot.service

Es ist in der Lage t o Starten Sie den Dienst nach dem Neustart, aber nach 1 - 2 Minuten verschwindet der Dienst. Siehe unten.

[email protected]:~$ ps aux | grep test 
root  2155 0.3 3.8 942196 38780 ?  Ssl 13:04 0:00 /home/ubuntu/.nvm/versions/node/v6.3.1/bin/node /home/ubuntu/.nvm/versions/node/v6.3.1/lib/node_modules/forever/bin/monitor /home/ubuntu/misc/service/test_run_at_boot/test_run_at_boot.js 
ubuntu 3223 0.0 0.1 12944 1092 pts/0 S+ 13:05 0:00 grep --color=auto test 
[email protected]:~$ cd misc/ 
[email protected]:~/misc/service/test_run_at_boot$ ls 
err.log node_modules out.log package.json start.sh stop.sh test_run_at_boot.js test_run_at_boot.service 
[email protected]:~/misc/service/test_run_at_boot$ ps aux | grep test 
ubuntu 3240 0.0 0.0 12944 1012 pts/0 S+ 13:05 0:00 grep --color=auto test 
[email protected]:~/misc/service/test_run_at_boot$ 

Update 2

In syslog

Aug 6 01:24:22 xyz start.sh[1663]: warn: --minUptime not set. Defaulting to: 1000ms 
Aug 6 01:24:22 xyz start.sh[1663]: warn: --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms 
Aug 6 01:24:22 xyz start.sh[1663]: info: Forever processing file: /home/ubuntu/misc/service/test_run_at_boot/test_run_at_boot.js 
Aug 6 01:24:22 xyz systemd[1]: test_run_at_boot.service: PID 3347 read from file /home/ubuntu/misc/service/test_run_at_boot/test_run_at_boot.pid does not exist or is a zombie. 
.... 
.... 
Aug 6 01:24:55 xyz systemd[1]: Started Execute cloud user/final scripts. 
Aug 6 01:24:55 xyz systemd[1]: Reached target Cloud-init target. 
Aug 6 01:25:00 xyz ntpdate[2709]: adjust time server 91.189.91.157 offset 0.104466 sec 
Aug 6 01:25:51 xyz systemd[1]: test_run_at_boot.service: Start operation timed out. Terminating. 
Aug 6 01:25:51 xyz systemd[1]: Failed to start test_run_at_boot. 
Aug 6 01:25:51 xyz systemd[1]: test_run_at_boot.service: Unit entered failed state. 
Aug 6 01:25:51 xyz systemd[1]: test_run_at_boot.service: Failed with result 'timeout'. 
+1

Haben Sie den Dienst mit 'systemctl enable' aktiviert? –

+0

normalerweise 'nodejs' auf Ubuntu – Matt

+0

und Sie brauchen nicht wirklich immer wenn Sie systemd haben – Matt

Antwort

1

Mit immer unter systemd ist ein bisschen wie für immer für immer laufen mit.

Ohne für immer wird die Systemd-Konfiguration einfacher.

[Unit] 
Description=test_run_at_boot 

[Service] 
ExecStart=/usr/bin/nodejs /home/ubuntu/misc/service/test_run_at_boot/test_run_at_boot.js 
Type=oneshot 
#Restart=on-failure 

[Install] 
WantedBy=multi-user.target 

Das Testskript Sie verwenden, ist ein Type=oneshot wie das Skript zu beenden wird erwartet, sonst systemd wird den Dienst berichten als gescheitert. Sobald Sie einen lang laufenden Dienst zu verwalten haben, können Sie Type=oneshot entfernen und Restart=on-failure verwenden, um den Dienst aufrecht zu erhalten, wie für immer.

stderr und stdout aus dem Prozess werden an das Journal Systemd gesendet. Auf Ubuntu geht das auf syslog.

Wenn es Funktionen von für immer Sie wirklich brauchen, dann erfordert Systemd ein bisschen mehr Setup. Die Type becomes forking.Sie müssen ein --pidFile einrichten und ein passendes systemd PIDFile= ebenso haben.

+0

siehe mein Update 1 – kenpeter