老哥们,问一个 go 在 Linux 把自生加入开机自启的问题

2023-10-17 16:11:13 +08:00
 leegoo

我的需求是 go 在启动的时候把自生加入开机自启,并且不依赖其他软件。

我在 windows 环境,go 可以新建一个文件(AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\start.bat),在脚本内可以调用 exe 程序 重启就会自动启动

但是在 linux 上,我把编译后的 go 文件进行执行,里面的代码有一句是 os.Create("/etc/init.d/start.sh") 在创建时 会创建失败,我以为是权限的问题 ,但是我是使用的是root用户,并且使用chmod 777了。 实际上 执行 os.Create("/tmp/start.sh")是成功的

查到的方案基本上都是通过用shell, 但是这样需要手动的添加

有没有办法解决linux执行 os.Create("/tmp/start.sh")失败的问题

linux 权限如下:

[root@localhost etc]# pwd
/etc
[root@localhost etc]# ll | grep init
drwxr-xr-x.  2 root root       24 Sep 27 23:42 gdbinit.d
lrwxrwxrwx.  1 root root       11 Sep 27 23:30 init.d -> rc.d/init.d
-rw-r--r--.  1 root root      511 Nov 16  2020 inittab

[root@localhost application]# ll
total 2076
-rwxr-xr-x. 1 root root 2111964 Oct 17 11:05 start
2980 次点击
所在节点    Go 编程语言
52 条回复
julyclyde
2023-10-18 12:18:06 +08:00
@adoal agLee with you

@phpfpm 是吧
julyclyde
2023-10-18 12:22:17 +08:00
@ysc3839 systemd 用户级别服务需要再另外运行一个 systemd 吧,还是需要用户先登录的吧

@pyu77
@kingfalse
你这做法(每分钟 cron )很腾讯
在旧版本 systemd 里,大量使用 cron 、在 cron 里运行后台服务,会导致大量的 login session 累积,压垮 systemd-logind ,随随便便占十几 G 内存

@kingfalse &符号是由 shell 处理的。也就是首先你要有个 shell ,也就是会产生一个 login session

@ksc010
@skywalkerfc
supervisorD 自己的启动和存活怎么保证呢?
ysc3839
2023-10-18 13:01:29 +08:00
@julyclyde 不需要吧,至少通过 StartTransientUnit 创建临时 service 不需要特殊权限
julyclyde
2023-10-18 13:07:29 +08:00
@ysc3839 StartTransientUnit 是指从 dbus 接口创建吗 user 级别的 unit 吧?
那由哪个程序来发这个消息呢?发消息的这个程序是怎么运行起来呢?
ysc3839
2023-10-18 13:22:39 +08:00
@julyclyde 只是举例子说明可以免额外权限创建用户级的 service ,不是说一定要用这种方案。具体能否 enable 一个用户级的 service ,我没调查过,但我猜测是可以的。
julyclyde
2023-10-18 13:38:29 +08:00
@ysc3839 但是 TransientUnit 不能“下次开机”的时候自动启动吧?那东西的 unit file 根本就不存盘吧
无法满足 OP 的需求
ysc3839
2023-10-18 13:42:42 +08:00
@julyclyde 我已经说了“不是说一定要用这种方案”
gejigeji
2023-10-18 15:30:00 +08:00
@julyclyde 进程退出后,login session 也不会退出?
julyclyde
2023-10-18 20:06:03 +08:00
@gejigeji 旧版本 systemd 对于大量 session 累积的情况,会无法正常清理。“理论上”进程退出之后,session 应该退出,但实际上没做到
gejigeji
2023-10-19 22:45:07 +08:00
@julyclyde ok, 直接/etc/crontab 应该没这个问题
julyclyde
2023-10-20 21:55:13 +08:00
@gejigeji 应该也会。session 是由/etc/pam.d/crond 生成的。
不过我没实际试过……

抛开 session 的问题不说,服务进程的“上级”是 crond 就够奇怪了,和上级是个 login shell 差不多奇怪
alsas
2023-11-01 16:38:00 +08:00
systemd

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

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

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

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

© 2021 V2EX