2016-08-05 506 views
3

我有一个简单的脚本“start.sh”,我想在每次启动ubuntu 16.04时使它自动启动。使用systemd在ubuntu 16.04启动脚本启动

我跟着这个帖子:https://serverfault.com/questions/773162/i-cant-get-the-right-items-to-boot-on-ubuntu-16-04-and-systemd

,使这个简单的脚本:https://github.com/kenpeter/test_run_at_boot

我把它放在这里。

/lib/systemd/system/test_run_at_boot.service 

我把它挂

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

每当我重新启动我的机器,它没有启动。

我也尝试附加实际的命令test_run_at_boot.service,仍然无法正常工作。

[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 

更新

syslog中,我得到了这一点。 /usr/bin/env: ‘node’: No such file or directory这会导致脚本在启动时失败。

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

更新1

我按照这个帖子

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

我做了一些改变

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

它能够ŧ o重启后启动服务,但1-2分钟后,服务消失。见下文。

[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$ 

更新2

在系统日志

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

你用'systemctl enable'启用了服务吗? –

+0

通常在Ubuntu – Matt

+0

上有'nodejs',当你有systemd – Matt

回答

1

下systemd永远使用有点像用永远永远运行。

没有永远,systemd配置变得更简单。

[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 

您所使用的测试脚本是脚本有望退出Type=oneshot,否则systemd为失败将报告服务。一旦你有一个长期运行的服务来管理你可以删除Type=oneshot和使用Restart=on-failure保持服务,永远如此。

stderrstdout从过程发送到systemd日志。在Ubuntu上,这转到syslog。

如果有真正需要的功能,那么systemd需要更多的设置。 Type becomes forking。您需要设置--pidFile,并且还有一个匹配的系统PIDFile=

+0

看到我的更新1 – kenpeter