Run a Shell Script at Linux Startup with Systemd
Linux系统,使用initd
时,想要开机启动时执行指定Shell脚本,只需修改/etc/rc.local
。现在的分发版基本改用Systemd
,找不到rc.local了。要实现类似的功能,有两个方案:
- 启用
rc-local.service
服务。 - 创建一个开机启动的服务。
推荐方案2,可以设置服务关联。比如设置网络服务启动后才执行指定脚本。
以Debian 11为例,记录一下两个方案的具体操作。
方案1,启用rc-local.service
服务
- 创建
/etc/rc.local
文件,并设置执行权限
cat <<EOF >/etc/rc.local
#!/bin/sh -e
# run at the end of each multiuser runlevel
exit 0 EOF
chmod +x /etc/rc.local
在exit 0
之前,编写要执行的Shell脚本。一定不要删除结尾的exit 0
。
- 启用服务
sudo systemctl enable --now rc-local
方案2,创建开机启动服务
就是配置一个Systemd
服务,并设置开机启动。其启动的代码,就是执行指定Shell脚本。
- 创建配置文件。
在目录/etc/systemd/system
,创建文件startup.service
(文件名可自取),并添加以下内容:
#################################
# Run at startup
#################################
[Unit]
Description=Run the shell script at system startup.
Wants=network-online.target
After=network.target network-online.target
[Service]
Type=simple
WorkingDirectory=/opt/startup
ExecStart=/opt/startup/run.sh
User=root
[Install]
WantedBy=multi-user.target
其中ExecStart
就是配置要执行的Shell脚本。这里假设Shell脚本需要联网后才能执行。
- 启用等待网络正常启动的服务。
服务配置依赖network-online.target
时,需要开启systemd-networkd-wait-online.service
服务,才能确保在网卡正确启动并获取IP地址后执行。
sudo systemctl enable systemd-networkd-wait-online.service
- 设置开机启动。
sudo systemctl daemon-reload
sudo enable startup.service