抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

在 Ubuntu Server 2020 启动时自动执行多个脚本

世上本来没有坑,挖的人多了,就越来越坑了

背景信息

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]
ExecStart=/root/init.sh

[Install]
WantedBy=default.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

参考:

Shell 脚本调用另一个脚本的三种方法


0条评论

发表评论