CentOS7 需要在开机时执行一个一次性脚本,请问如何操作?

2022-10-18 10:27:09 +08:00
 LxnChan

现有一个一次性脚本,需要在开机时以特定用户和组执行(执行后该脚本相当于以后台守护的方式执行)。

现在有以下几种方案:

  1. rc.local:写进去是写进去了但是不知道为什么死活不生效。
  2. SystemD:创建了 Service 配置文件,但是会报错,也没有正确启动。

目前已经确认的是rc.local已经加了对应的权限:

[root@testbench-C ~]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 Sep 18 23:46 /etc/rc.local -> rc.d/rc.local
[root@testbench-C ~]# ll /etc/rc.d/rc.local
-rwxr--r--. 1 root root 542 Oct 17 22:04 /etc/rc.d/rc.local

SystemD 配置文件:

[Unit]
Description=myservice
After=syslog.target
After=network.target

[Service]
Type=oneshot
User=myuser
Group=myuser
ExecStart=/home/tsh2/my.sh start

[Install]
WantedBy=multi-user.target
4146 次点击
所在节点    Linux
28 条回复
linxi09
2022-10-18 10:33:11 +08:00
/home/tsh2/my.sh 是不是 给了执行全县
zengxs
2022-10-18 10:33:19 +08:00
crontab @reboot
LxnChan
2022-10-18 10:35:39 +08:00
@linxi09 肯定是有执行权限的,单独执行是可以执行的
@zengxs crontab 不成定时执行了吗
jasonyang9
2022-10-18 10:37:54 +08:00
systemd 的 Timer ,OnBootSec 。另外具体的错误是啥
LxnChan
2022-10-18 10:41:08 +08:00
@jasonyang9 没有具体错误,`systemctl start myser.service`没有输出,`systemctl status myser`输出就是正常脚本的执行输出,没有报错。
另外请教一下 Timer 是什么,我猜会不会是 Type=oneshot ,该脚本创建好子进程之后切到后台,systemd 以为执行完了就把脚本连着的子进程全给 kill 了
eason1874
2022-10-18 10:54:24 +08:00
rc-local 也是一个服务,也需要设置开机启动 systemctl enable rc-local

用 systemd 的话,不能省略 shell 程序路径吧 ExecStart=/bin/bash /home/tsh2/my.sh start

还有,改完 service 文件记得执行 sudo systemctl daemon-reload
eason1874
2022-10-18 10:55:26 +08:00
type 改 simple
doubtlhy
2022-10-18 10:58:01 +08:00
要让 /etc/rc.local 开机执行需要添加可执行权限 chmod +x /etc/rc.d/rc.local
mijazz
2022-10-18 11:00:40 +08:00
确定用户和组的权限之后, `Type`改成`simple`或者`forking`, 具体参考 systemd 的文档.
jasonyang9
2022-10-18 11:04:09 +08:00
@LxnChan 建议看看 systemd 的相关文档。这里搜了一篇 https://wiki.archlinux.org/title/systemd/Timers
bao3
2022-10-18 11:11:36 +08:00
其实 rc.local 挺好的,结果过渡到 systemd 后给弄没了,非要自己想办法创建。
我现在自己装的 debian ,脚本里要做的就是先把 rc.local 弄好。很多一次性脚本,用这个还是很方便的。
jasonyang9
2022-10-18 11:24:34 +08:00
理解错了,忽略我的回复。lz 的需求不涉及到 timer 的,直接 enable 这个服务单元即可,普通的 systemd 服务单元,执行一个脚本
zer0z
2022-10-18 11:37:07 +08:00
8 楼说的对。
rc.local 文件中应该有默认提示的,要给 rc.local 加可执行权限。
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
ysc3839
2022-10-18 12:33:19 +08:00
@LxnChan #5 “`systemctl status myser`输出就是正常脚本的执行输出,没有报错”
那为什么一开始说会报错呢?到底有什么问题?
zerone0086
2022-10-18 12:37:12 +08:00
shi'sh 试试,不知道对你有没有用
cattyhouse
2022-10-18 12:45:18 +08:00
crontab -e

@reboot /path/to/script
tulongtou
2022-10-18 12:56:55 +08:00
@LxnChan reboot 是开机执行一次,不是定时执行
julyclyde
2022-10-18 13:04:41 +08:00
如果是后台服务的话,似乎不应该用“一次性”这种词啊

systemd 里 one-shot 是“执行之后会很快完成”的那种
rayn32
2022-10-18 13:23:21 +08:00
使用 systemd 控制的化,可以用 systemd 服务开机自启, 而不是用 rc.local
设置开机自动启动命令
systemctl enable serviceName
yanqiyu
2022-10-18 13:54:44 +08:00
> 执行后该脚本相当于以后台守护的方式执行
这种情况下应该是 Type=simple
oneshot 的话 systemd 会预期你的脚本在一段时间之后退出并干掉所有子进程

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/887703

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX