Linux下实现程序开机自启(rc.local 和 systemctl)
需求:
实现了一个程序,需要在ubuntu上跑起来。能开机自启,且崩溃了也能自己重启。有两种实现方式,个人推荐第二种。
方式1:
实现方式:
直接将要启动程序的运行命令加在 /etc/rc.local 中,开机时会运行这里的命令。
我使用时:写了一个脚本DDR_Guard.sh,在脚本里面循环判断程序有没有开启。如果没有开启,则调用相应的启动指令。
比如:
注意:
1)此方式在Ubuntu20.04之后就取消了,只在Ubuntu16.04中测试可行。
2)在 /etc/rc.local 中的命令一定要可以结束,如果结束不了会导致系统开不起来。所以我用了后台运行:也就是nohup。
方式2(推荐使用):
采用systemctl的方式,好像很挺方便的样子。(实际用时把youngtest换成自己需要的名字即可)
强烈建议看看这个文档,里面介绍了一些参数的具体含义:https://ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
准备工作:
1)为了测试,我写了一个程序test0726,里面循环往一个文件里面输入一句话。
2)还写了一个脚本:youngtest.sh
#!/bin/bash cd /home/dadao/workspace/test/systemctltestLog v_time=`date "+%Y_%m_%d_%H_%M_%S"` echo $v_time" Start runing ++++++++++++++++++++ " >> youngtestsh.log ./test0726 echo $v_time" Process quit ---------------------- " >> youngtestsh.log
3)需要有执行权限:chmod +x youngtest.sh test0726
如何配置:
1)编写一个 youngtest.service,内容如下:
[Unit] Description=test [Service] Type=simple User=dadao ExecStart=/home/dadao/workspace/test/systemctltestLog/youngtest.sh Restart=always RestartSec=30 StartLimitInterval=0 [Install] WantedBy=multi-user.target graphical.target
以下参数根据实际需要进行配置:
User:表示以哪个用户启动,不写默认是root。
ExecStart:就是要执行的语句。
Restart=always: 只要不是通过systemctl stop来停止服务,任何情况下都必须要重启服务,默认值为no。还可以配置有条件重启,具体参考上述文档。
RestartSec=5: 重启间隔,比如某次异常后,等待5(s)再进行启动,默认值0.1(s)
StartLimitInterval: 无限次重启,默认是10秒内如果重启超过5次则不再重启,设置为0表示不限次数重启
2)拷贝到: /lib/systemd/system 可能还要注意权限问题。
3)修改配置文件后需要重加载配置:
sudo systemctl daemon-reload
4)设置开机自启:
sudo systemctl enable youngtest.service
之后就可以直接重启了。
5)之后就可以操作了:
启动:
sudo systemctl start youngtest.service
停止:
sudo systemctl stop youngtest.service
查看状态:
sudo systemctl status youngtest.service
测试自动重启功能: