LxnChan
V2EX  ›  Linux

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

By LxnChan at 2022 年 10 月 18 日 · 5621 次点击

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

现在有以下几种方案:

  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
第 1 条附言  ·  2022 年 10 月 18 日

已解决rc-local无法自启动的问题,感谢6F和15F,rc.local(rc-local)本身也是个Service,受SystemD管理,需要先行开启。

systemctl enable rc-local
chmod +x /etc/rc.local
chmox +x /etc/rc.d/rc.local

再次感谢本帖中帮助我的人,特别感谢6F和12F。

第 2 条附言  ·  2022 年 10 月 18 日
上面写错了,特别感谢的是 6F 和 15F
28 条回复  •  2022-10-21 15:18:45 +08:00
linxi09
   1
linxi09  
   2022 年 10 月 18 日
/home/tsh2/my.sh 是不是 给了执行全县
zengxs
   2
zengxs  
   2022 年 10 月 18 日
crontab @reboot
LxnChan
   3
LxnChan  
OP
   2022 年 10 月 18 日
@linxi09 肯定是有执行权限的,单独执行是可以执行的
@zengxs crontab 不成定时执行了吗
jasonyang9
   4
jasonyang9  
   2022 年 10 月 18 日 via Android
systemd 的 Timer ,OnBootSec 。另外具体的错误是啥
LxnChan
   5
LxnChan  
OP
   2022 年 10 月 18 日
@jasonyang9 没有具体错误,`systemctl start myser.service`没有输出,`systemctl status myser`输出就是正常脚本的执行输出,没有报错。
另外请教一下 Timer 是什么,我猜会不会是 Type=oneshot ,该脚本创建好子进程之后切到后台,systemd 以为执行完了就把脚本连着的子进程全给 kill 了
eason1874
   6
eason1874  
   2022 年 10 月 18 日   ❤️ 2
rc-local 也是一个服务,也需要设置开机启动 systemctl enable rc-local

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

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

@reboot /path/to/script
DonaidTrump
   17
DonaidTrump  
   2022 年 10 月 18 日 via iPhone
@LxnChan reboot 是开机执行一次,不是定时执行
julyclyde
   18
julyclyde  
   2022 年 10 月 18 日
如果是后台服务的话,似乎不应该用“一次性”这种词啊

systemd 里 one-shot 是“执行之后会很快完成”的那种
rayn32
   19
rayn32  
   2022 年 10 月 18 日
使用 systemd 控制的化,可以用 systemd 服务开机自启, 而不是用 rc.local
设置开机自动启动命令
systemctl enable serviceName
yanqiyu
   20
yanqiyu  
   2022 年 10 月 18 日
> 执行后该脚本相当于以后台守护的方式执行
这种情况下应该是 Type=simple
oneshot 的话 systemd 会预期你的脚本在一段时间之后退出并干掉所有子进程
yanqiyu
   21
yanqiyu  
   2022 年 10 月 18 日
LxnChan
   22
LxnChan  
OP
   2022 年 10 月 18 日
@doubtlhy @zer0z 麻烦审题,已经给过权限了,而且我也贴出对应文件的权限了
@ysc3839 因为这脚本并非是一直运行的那种,脚本内实现的是类似于 nohup 的原理,因此正常来说脚本确认程序已在后台运行就会自动退出。现在的情况是脚本返回正常运行了,但是从脚本启动的后台程序并没有在运行。
@yanqiyu 我现在也是觉得是这个原因,惭愧的是我看的也是这篇文档
---
@zerone0086 @eason1874 谢谢,是有效的,确实依 6 楼和 15 楼所说 rc-local 也是个服务。
---
@bao3 确实,感觉现在这个 rc-local 有点脱裤子放屁了,本身是控制自启的脚本,居然还得先开启自启脚本的自启动。
cattyhouse
   23
cattyhouse  
   2022 年 10 月 18 日 via iPhone
没看出来你解决了什么

需要在开机时以特定用户和组执行

用 local ,权限解决了?

你这种情况 用特定用户和组的 crontan @reboot 是最佳答案。16f
LxnChan
   24
LxnChan  
OP
   2022 年 10 月 18 日
@cattyhouse 权限可以解决啊

```sh
su - <user> -c '/home/tsh2/my.sh start'
```
julyclyde
   25
julyclyde  
   2022 年 10 月 18 日
@LxnChan 有些脚本是 root 权限初始化,再降级运行实际服务程序的
这种情况不能直接指定以低权限运行

转 systemd 的话,需要费点心改写
LxnChan
   26
LxnChan  
OP
   2022 年 10 月 18 日
@julyclyde 确实,不过其他解决方案上面也说了,对应用户的 crontab 或者干脆 systemd
ysc3839
   27
ysc3839  
   2022 年 10 月 18 日 via Android
@LxnChan 那你应该把脚本改成持续运行的模式
zuijiapangzi
   28
zuijiapangzi  
   2022 年 10 月 21 日
开头把环境变量协商。
#!/bin/bash
在加载下 /etc/profile
source /etc/profile

rc.local 的权限需要确认。很多刚安装的系统的这个文件是没有执行权限的。
Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
© 2026 V2EX · 54ms · 3.9.8.5