将Shell脚本转型为Systemd服务:简化自动化管理流程
时间:2024-12-23 00:01 作者:Anglei 分类: Linux
背景介绍从 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

推荐阅读:
![]() 路过(0) |
![]() 雷人(0) |
![]() 握手(0) |
![]() 鲜花(0) |
![]() 鸡蛋(0) |