原创 青菜浪人
背景介绍
从 Ubuntu 17.10 开始,/etc/rc.local 文件不再默认存在于系统中,因为 systemd 已成为主要的初始化系统。如果需要在系统启动时自动执行某些命令,可以通过编写 Shell 脚本并将其封装为一个 systemd 服务来实现这一操作。
实现方法
这里以一个简单的脚本为例,将需要开机自动执行的命令写入脚本文件内,赋予可执行权限。
脚本内容如下:
#!/usr/bin/env bash
sudo ip route del default via 192.168.1.254
sudo ip route add 192.168.101.0/24 via 192.168.1.254 dev ens33
该脚本用于删除和添加路由,赋予脚本可执行权限
sudo chmod +x /usr/local/bin/routeadd.sh
创建 systemd 文件
文件存放位置:
/etc/systemd/system/xx.service
写入以下内容,在 ExecStart 中指定脚本存放位置
[Unit]
Description=routeadd
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/routeadd.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
修改完成后赋予自定义文件可执行权限
sudo chmod +x /etc/systemd/system/xx.service
最后,设置为开机自启动即可
systemctl enable routeadd.service
查看开机启动项,可以看到自定义的服务已经设置成功了
PS
:如果当前用户为普通用户,需要注意脚本内容中是否有需要使用 sudo 命令的部分。如果有,需提前为该用户配置免密执行 sudo 的权限,否则脚本将无法正确执行。
配置用户免密执行sudo
为了使普通用户能够免密执行自定义脚本并实现开机自启动,需要修改 /etc/sudoers 文件,添加相应的免密执行命令及其对应的用户
#配置这个是对sudo组中的所有用户生效
%sudo ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) NOPASSWD:/usr/sbin/ip,/usr/bin/systemctl
#如只需要对单独的用户生效,则注释掉%sudo该行,添加以下内容即可,test为用户名
test ALL=(ALL:ALL) ALL
test ALL=(ALL:ALL) NOPASSWD:/usr/sbin/ip,/usr/bin/systemctl