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

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

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

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

=====

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

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

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

倒是检查下错误码啊
stephenxiaxy
206 天前
systemd

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

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

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

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

© 2021 V2EX