老哥们,问一个 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
2972 次点击
所在节点    Go 编程语言
52 条回复
exkernel
2023-10-17 16:24:21 +08:00
xiao201261
2023-10-17 16:24:53 +08:00
你是打算跑 docker 还是?
init.d(openrc) 或者什么的是很古老写法,在现代的 Linux 现在应该使用 systemd 来守护,来启动进程。
bg7lgb
2023-10-17 16:27:25 +08:00
直接加在 rc.local
liarsa
2023-10-17 16:28:13 +08:00
我同意二楼同学的说法
julyclyde
2023-10-17 16:36:40 +08:00
建议参考一下/t/982696
leegoo
2023-10-17 16:42:03 +08:00
@julyclyde 这是正儿八经的需求。。跟这个没什么关系
leegoo
2023-10-17 16:43:36 +08:00
@xiao201261 不跑 docker ,如果用 systemd 也需要自己手动编写脚本把(我的意思是没办法在程序中自动加入开机自启)
julyclyde
2023-10-17 16:45:05 +08:00
@leegoo 正儿八经的需求,找一个并不懂这方面知识的人来做?并没觉得这需求有多么正儿八经

你在 windows 环境设置的那个是用户级自动启动吧,是登录之后才有的
服务器哪儿有机会让你登录啊

设置系统级自动启动需要系统级的权限,不是你想写就能随便往里写的
xiao201261
2023-10-17 16:51:05 +08:00
@leegoo 如果你还是想直接加 init.d 的话,你可以检查一下 selinux 是否阻止了你的程序往 /etc/init.d 加文件 用 dmesg 看最近几条日志就知道了。

=====

让进程守护是个复杂的操作,什么不需要写脚本呢?
让什么用户运行你的程序?
是不是要等待网络或者数据库启动后再运行?(优先级)
要不要限制什么权限?
原始的 /etc/init.d 里面也是有不少的配置选项呢,脚本量和 systemd 相比差不了多少(何况你系统基本也是 systemd 运行的,保留 /etc/init.d 只是为了兼容)

难道你的启动脚本就一行,用来启动 go 的程序就撒手不管了?
真的,跑服务有很多需要考虑的东西,不要只启动就行了,守护在哪里,日志放哪里.....
leegoo
2023-10-17 16:54:36 +08:00
@julyclyde 大哥,我觉得你真是有点没事找事。公司有这个需求,我只是来实现而已。你为什么非要觉得我要搞一个最大权限?
意思是公司派了一个需求,又只有你适合去做这个事情,你不做吗?
不是每个公司都有专职的 DBA 和运维
julyclyde
2023-10-17 17:07:13 +08:00
@leegoo 你这个需求,客观上就是需要最大权限
但是你对这个不熟悉,掌握这个权限会有风险和错误
这才是问题
rimutuyuan
2023-10-17 17:08:51 +08:00
为什么不写在 shell 脚本去启动呢
XiLingHost
2023-10-17 17:11:40 +08:00
写个 systemd 的 unit 不就好了,然后程序里把 unit 链接到/etc/systemd/system/multi-user.target.wants/
purrgil
2023-10-17 17:15:30 +08:00
windows 下我用任务计划自启。
还能同时做到间隔几分钟自启,防止程序被杀掉。

linux 下对应的当然是 crontab 了。
purrgil
2023-10-17 17:20:17 +08:00
你把程序放 Startup 里启动,那服务器每次重启是不是要进桌面才会启动?
julyclyde
2023-10-17 17:21:26 +08:00
@purrgil 你这个做法很腾讯
在 linux 里用 crontab 启动后台任务(尤其是用户级 crontab )是一个极其错误的行为
会导致后台服务使用的资源被计入用户的统计数据里去
purrgil
2023-10-17 17:31:13 +08:00
@julyclyde 那我可理解不了。
cron 不就是干这个用的?
huangzhiyia
2023-10-17 17:36:15 +08:00
你都有 root 了,可以写 /etc/systemd/system/ 里面,用 systemd 来管理。
hsfzxjy
2023-10-17 17:47:08 +08:00
> os.Create("/etc/init.d/start.sh") 失败

倒是检查下错误码啊
stephenxiaxy
2023-10-17 17:51:32 +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