简体   繁体   中英

Use systemd to start a script at ubuntu 16.04 boot

I have a simple script "start.sh", which I want to make it auto-boot every time, when ubuntu 16.04 restarts.

I followed this post: https://serverfault.com/questions/773162/i-cant-get-the-right-items-to-boot-on-ubuntu-16-04-and-systemd

And make this simple script: https://github.com/kenpeter/test_run_at_boot

I put it in here.

/lib/systemd/system/test_run_at_boot.service

I have it linked

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

Every time I reboot my machine, it is not starting.

I also try to attach the actual command to test_run_at_boot.service, still not working.

[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

Update

In syslog, I got this. /usr/bin/env: 'node': No such file or directory This causes the script fails at start.

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'.

Update 1

I follow this post

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

I made some changes

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

It is able to start the service after reboot, but after 1 - 2 mins, the service disappear. See below.

ubuntu@xyz:~$ 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
ubuntu@xyz:~$ cd misc/
ubuntu@xyz:~/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
ubuntu@xyz:~/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
ubuntu@xyz:~/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'.

Using forever under systemd is a bit like using forever to run forever.

Without forever, the systemd config becomes simpler.

[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

The test script you are using is a Type=oneshot as the script is expected to exit, otherwise systemd will report the service as failed. Once you have a long running service to manage you can remove Type=oneshot and use Restart=on-failure to keep the service up, like forever does.

stderr and stdout from the process are sent to the systemd journal. On Ubuntu this goes to syslog.

If there are features of forever you really need, then systemd requires a bit more setup. The Type becomes forking . You will need to setup a --pidFile and have a matching systemd PIDFile= as well.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM