将Shell脚本转换为Systemd服务:轻松实现自动化管理

背景介绍

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

查看开机启动项,可以看到自定义的服务已经设置成功了

将Shell脚本转换为Systemd服务:轻松实现自动化管理
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
将Shell脚本转换为Systemd服务:轻松实现自动化管理

▽往期推荐△










原文始发于微信公众号(青菜浪人):

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/308387.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!