现有一个一次性脚本,需要在开机时以特定用户和组执行(执行后该脚本相当于以后台守护的方式执行)。
现在有以下几种方案:
rc.local
:写进去是写进去了但是不知道为什么死活不生效。目前已经确认的是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
已解决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。
4
jasonyang9 2022-10-18 10:37:54 +08:00 via Android
systemd 的 Timer ,OnBootSec 。另外具体的错误是啥
|
5
LxnChan OP @jasonyang9 没有具体错误,`systemctl start myser.service`没有输出,`systemctl status myser`输出就是正常脚本的执行输出,没有报错。
另外请教一下 Timer 是什么,我猜会不会是 Type=oneshot ,该脚本创建好子进程之后切到后台,systemd 以为执行完了就把脚本连着的子进程全给 kill 了 |
6
eason1874 2022-10-18 10:54:24 +08:00 2
rc-local 也是一个服务,也需要设置开机启动 systemctl enable rc-local
用 systemd 的话,不能省略 shell 程序路径吧 ExecStart=/bin/bash /home/tsh2/my.sh start 还有,改完 service 文件记得执行 sudo systemctl daemon-reload |
7
eason1874 2022-10-18 10:55:26 +08:00
type 改 simple
|
8
doubtlhy 2022-10-18 10:58:01 +08:00 via iPhone
要让 /etc/rc.local 开机执行需要添加可执行权限 chmod +x /etc/rc.d/rc.local
|
9
mijazz 2022-10-18 11:00:40 +08:00
确定用户和组的权限之后, `Type`改成`simple`或者`forking`, 具体参考 systemd 的文档.
|
10
jasonyang9 2022-10-18 11:04:09 +08:00 via Android
@LxnChan 建议看看 systemd 的相关文档。这里搜了一篇 https://wiki.archlinux.org/title/systemd/Timers
|
11
bao3 2022-10-18 11:11:36 +08:00
其实 rc.local 挺好的,结果过渡到 systemd 后给弄没了,非要自己想办法创建。
我现在自己装的 debian ,脚本里要做的就是先把 rc.local 弄好。很多一次性脚本,用这个还是很方便的。 |
12
jasonyang9 2022-10-18 11:24:34 +08:00 via Android
理解错了,忽略我的回复。lz 的需求不涉及到 timer 的,直接 enable 这个服务单元即可,普通的 systemd 服务单元,执行一个脚本
|
13
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 |
14
ysc3839 2022-10-18 12:33:19 +08:00 via Android 1
@LxnChan #5 “`systemctl status myser`输出就是正常脚本的执行输出,没有报错”
那为什么一开始说会报错呢?到底有什么问题? |
15
zerone0086 2022-10-18 12:37:12 +08:00 2
|
16
cattyhouse 2022-10-18 12:45:18 +08:00 via iPhone
|
18
julyclyde 2022-10-18 13:04:41 +08:00
如果是后台服务的话,似乎不应该用“一次性”这种词啊
systemd 里 one-shot 是“执行之后会很快完成”的那种 |
19
rayn32 2022-10-18 13:23:21 +08:00
使用 systemd 控制的化,可以用 systemd 服务开机自启, 而不是用 rc.local
设置开机自动启动命令 systemctl enable serviceName |
20
yanqiyu 2022-10-18 13:54:44 +08:00
> 执行后该脚本相当于以后台守护的方式执行
这种情况下应该是 Type=simple oneshot 的话 systemd 会预期你的脚本在一段时间之后退出并干掉所有子进程 |
21
yanqiyu 2022-10-18 13:55:53 +08:00
|
22
LxnChan OP @doubtlhy @zer0z 麻烦审题,已经给过权限了,而且我也贴出对应文件的权限了
@ysc3839 因为这脚本并非是一直运行的那种,脚本内实现的是类似于 nohup 的原理,因此正常来说脚本确认程序已在后台运行就会自动退出。现在的情况是脚本返回正常运行了,但是从脚本启动的后台程序并没有在运行。 @yanqiyu 我现在也是觉得是这个原因,惭愧的是我看的也是这篇文档 --- @zerone0086 @eason1874 谢谢,是有效的,确实依 6 楼和 15 楼所说 rc-local 也是个服务。 --- @bao3 确实,感觉现在这个 rc-local 有点脱裤子放屁了,本身是控制自启的脚本,居然还得先开启自启脚本的自启动。 |
23
cattyhouse 2022-10-18 14:44:19 +08:00 via iPhone
|
24
LxnChan OP |
25
julyclyde 2022-10-18 16:01:21 +08:00
|
28
zuijiapangzi 2022-10-21 15:18:45 +08:00
开头把环境变量协商。
#!/bin/bash 在加载下 /etc/profile source /etc/profile rc.local 的权限需要确认。很多刚安装的系统的这个文件是没有执行权限的。 |