Linux开机启动执行脚本

方法 1:rc.local

文件位置在 /etc/rc.local。比较简单的方法,但是有些 linux 版本不支持,例如 debian 默认没有 rc.local 这个文件,但是有这个服务,并且这个服务是关闭的。

注意:/etc/rc.local 和/etc/rc.d/rc.local 区别在于,/etc/rc.local 是/etc/rc.d/rc.local 的软连接

1)使用方式

1
2
3
4
5
# 先赋予文件执行权限,有就不用了
chmod +x /etc/rc.d/rc.local
# 查看是否有执行权限
ls -l /etc/rc.d/rc.local
# 将想要执行的命令添加到 rc.local 文件末尾即可,也可以执行 .sh 文件

2)简单测试一下

先创建一个文件:touch /root/111.txt,在 rc.local 文件后面添加命令 /bin/echo "abc11" > /root/111.txt,重启验证,查看命令是否执行。

images/image-20240920093147076.png

重启后

images/image-20240920093554403.png

3)debian 系统没有 rc.local 怎么办

debian 虽然默认没有 rc.local 这个文件,但是有这个服务,并且这个服务是关闭的。

images/image-20240920094412500.png

手动创建 /etc/rc.local 文件,写入以下内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exit 0

然后赋予权限

1
chmod +x /etc/rc.local

启动 rc-local 服务,并设置为开机自启动。有警告不用管

1
systemctl enable --now rc-local  # 设置为开机启动,并且,现在启动这个服务。--now:现在就启动这个服务

然后你就可以把需要开机启动的命令添加到 /etc/rc.local 文件,丢在 exit 0 前面即可,并尝试重启以后试试是否生效了。

方法 2:systemd

参考: https://blog.csdn.net/lu_embedded/article/details/132424115

Linux 的 service 脚本一般存放在 /etc/systemd/ 和 /usr/lib/systemd 路径下,前者包含着多个 . target. wants 文件,如 multi-user. target. wants 等;而后者为安装软件生成 service 的目录,一般编写自己的 service 可以放在此目录下。但需要注意的是,位于 /usr/lib/systemd/ 中服务脚本可能会在下次更新时被覆盖。

无论是 /etc/systemd/ 还是 /usr/lib/systemd 目录,其中又包含 system 和 user 目录。前者是系统服务,开机不需要用户登录即可运行的服务;后者是用户服务,需要用户登录后才能运行的服务

在/etc/systemd/system/目录下创建一个 test.service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[Unit]
# 服务名称,可自定义
Description = cobaltstrike server

[Service]
Type = forking
# 启动的命令
ExecStart = /bin/bash -c "/usr/local/start.sh"

[Install]
WantedBy = multi-user.target

完成服务脚本编写后,需要执行以下命令重新加载所有的 systemd 服务,否则会找不到 service 服务。

1
sudo systemctl daemon-reload

问题:超时报错,服务停止运行。有时脚本文件中特意设置很长的等待时间或要完成任务的时间本身就很长,如果在后台服务脚本中直接执行该脚本,就会收到超时信息,服务自动终止,这是我所不希望看到的

1
2
3
4
报错信息:xxxx.service: start operation timed out. Terminating.

解决这个问题也很简单,借助“bash -c”,bash -c 的作用是将一个长字符串当做一条完整的命令来执行,如果在脚本路径后面加上后台运行符号(&),run.sh 脚本就会在后台运行,不会一直处于挂起状态,systemd 也就不会一直等待 run.sh 执行完成了。经过测试,完全符合预期,因此,最终的解决方案是:
ExecStart=/bin/bash -c "/data/leanote/bin/run.sh &"

方法 3:init.d

参考: https://blog.csdn.net/weixin_43425561/article/details/131447216

方法 4:cron

通过定时任务执行命令或脚本。

1
2
3
crontab -e
# 通过@reboot 命令,后面填入需要开机自启的命令或脚本路径。
# 注意脚本要有执行权限

images/image-20240920103828703.png

重启后,查看 111.txt 文件

images/image-20240920104014381.png

0%