世上本来没有坑,挖的人多了,就越来越坑了
背景信息
2020了,大家都知道现在用的是 systemctl,官方手册在此,勿听其他人胡说八道:http://manpages.ubuntu.com/manpages/focal/en/man5/systemd.service.5.html
往下翻,找到 example,有好几类,我只记录我的需求。(好像我只需要 default 即可)
我有一个二进制文件,里面有个 while 循环,意味着要长期在后台。
我还有一个 sh,用来手动挂载磁盘,意味着只用执行一次。
实现方案
首先,根据上述条件,为了麻烦,就需要在一个文件里去执行,这样才好给一个服务去托管。
所以 service 这样写(文件名:lckiss-init.service,存放路径:/etc/systemd/system/):
[Unit] After=network.service [Service] Type=forking User=root Group=root ExecStart=/root/init.sh [Install] WWantedBy=multi-user.target
After:指在网络服务启动后进行启动
ExecStart:需要执行的命令位置
WantedBy:可指定单用户或者多用户,我这里默认,默认是啥我没看
需要执行的文件init.sh内容:
#!/bin/bash source /root/init/mount.sh ./root/init/fan_ctrl
source 的方式去执行脚本,当前脚本中的内容才会继续执行下去,后面则是直接执行一个二进制文件,因为二进制文件不会退出,这个 sh 会一直在后台运行。
需要注意的是,init.sh 中的脚本以及文件,请用绝对路径,因为使用相对路径 systemd 在执行脚本时会找不到文件。
测试下:
#重新加载守护进程 刷新服务列表 systemctl daemon-reload #启动服务 systemctl start lckiss-init.service
看看你的脚本有没有生效,如果没有,使用以下命令查看日志并获取出错原因:
journalctl -xe
至于文件权限,755 +x 即可,644其实也行。
如果一切都没问题的话,那就启用这个服务让其开机自动执行吧:
systemctl enable lckiss-init.service
接下来,还有什么需要执行的,就只用加在 init 脚本里就好了,以上。
PS:服务 type 什么都不指定的时候是 simple,但是官方更推荐 notify
参考:
本站由以下主机服务商提供服务支持:
0条评论