老哥们,问一个 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
2973 次点击
所在节点    Go 编程语言
52 条回复
tairan2006
2023-10-17 18:35:13 +08:00
你这 windows 也要写个 bat 啊,并不是依靠自身,而且你这么写不能保活。

对比你的 bat 方案,linux 下直接创建 CronJob 最简单,用 @reboot.
aisk
2023-10-17 18:40:58 +08:00
@purrgil 不是。
kkocdko
2023-10-17 19:04:00 +08:00
如果是实体机,请你通过 systemd 的 service 做。由 systemd 完成自启动,自动拉起,日志管理等等。
kkocdko
2023-10-17 19:05:55 +08:00
emmm ,看到楼上的回复了,楼主你想怎么做就怎么做吧
X4hB5a
2023-10-17 19:35:00 +08:00
liberize
2023-10-17 19:38:41 +08:00
如果是桌面程序,可以在~/.config/autostart 下创建一个.desktop 文件,基本对标 windows

如果是服务端程序,可以在/etc/systemd/system 下面创建一个.service 文件,需要 root
julyclyde
2023-10-17 19:39:22 +08:00
@purrgil cron 是做短任务用的
ysc3839
2023-10-17 19:42:27 +08:00
@liberize 没记错的话 systemd 是可以注册用户级别的服务的。
expy
2023-10-17 19:48:49 +08:00
参考服务器被入侵挖矿的,用 cron 。
kingfalse
2023-10-17 20:03:06 +08:00
crontab ,每分钟执行一次 sh ,判断没有进程就启动,这不安全的多,兼容性极佳
kingfalse
2023-10-17 20:04:07 +08:00
@julyclyde 加个&不就可以了吗?
phpfpm
2023-10-17 20:21:15 +08:00
@julyclyde 是我在水木认识的那位大佬吗?
ksc010
2023-10-17 20:22:21 +08:00
可以 用 supervisor
skywalkerfc
2023-10-17 20:50:43 +08:00
cron 定时任务
systemd/init.d 后台常驻进程(更偏系统层,随 Linux 启动而启动)
supervisor 后台常驻进程(更偏用户层,一般用来管理自己写的常驻脚本偏多)
yanqiyu
2023-10-17 21:15:58 +08:00
> 我的需求是 go 在启动的时候把自生加入开机自启,并且不依赖其他软件。

"并且不依赖其他软件"? 要是 init 都不想依赖那就麻烦了,建议添加 init=你的程序 替代掉 init ,启动自身之后创建容器启动原来的 init 作为给用户的系统

开个玩笑

你得依赖点什么东西,要是 systemd 就创建 systemd unit: https://www.freedesktop.org/software/systemd/man/systemd.unit.html
要是 sysV init 就是/etc/rc.d/xxx.sh, /etc/init.d/,/etc/rc.d/init.d


写好一个可用的 systemd unit 没那么难。

以及就算创建文件失败至少给点失败的信息,不然大家水晶球也水晶不出来
SenLief
2023-10-17 23:07:34 +08:00
systemd.service
voidmnwzp
2023-10-18 00:03:49 +08:00
注册服务然后自启动
pyu77
2023-10-18 09:57:40 +08:00
shell 脚本写个,然后放到 rc.local 启动就拉起来。
想要中断后自动拉起,可以加到 crontab 定时任务。
adoal
2023-10-18 10:06:04 +08:00
@julyclyde 放弃助人情结,尊重草台班子(们)
tangtang369
2023-10-18 11:27:38 +08:00
一楼的答案就是正解 如果用 Go 的话都是用这个第三方模块来实现

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

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

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

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

© 2021 V2EX