怎么让程序开机启动并且不被杀

我有一个自己写的程序希望开机启动,我想用service的方式实现

[Unit]
Description=Foo
[Service]
ExecStart=/home/hh/rs485/a.out
[Install]
WantedBy=multi-user.target


不过我发现开机后运行几秒程序就直接杀掉了

如果我自己在bash里运行就不会有这个问题

这是为什么呢,顺带一提这个程序用了lddcutil库,

具体的日志消息呢?你这个程序启动后会自己fork然后退出吗?

没有在程序里写fork,然后我也没有在程序里写日志

是说systemd的日志。服务停止时它肯定会打日志的。

这咋看呀

然后如果我开机后自己运行service也不会有问题,这是一个权限问题吗

4月 18 17:29:27 hosthh a.out[3622]: [  3622] (ddci_init) Done.  Returning 0 
4月 18 17:29:27 hosthh a.out[3622]: Library initialization complete. 
4月 18 17:29:26 hosthh a.out[3622]: Starting. library built Not set at Not set, library_initialized=false, libopts=|| 
4月 18 17:29:26 hosthh a.out[3622]: Starting libddcutil. library built Not set at Not set. stdout_stderr_redirected=false
 

听起来是启动顺序的问题——你的程序需要访问网络吗?

sudo journalctl --since=启动的减一分钟时间 --until=退出的时间加一分钟

不需要

既然是自己写的程序,那可以把源码发出来看看吗?

main.c.log (6.6 KB)

然后还调用了一个目标文件,就不上传了

我刚刚重启,在看自重启来的日志时没有发现我最上方service相关的,也没有发现我程序退出的内容,但是我知道程序一定打开了一段时间,但是service是dead的

○ light.service - Foo
Loaded: loaded (/home/hh/.config/systemd/user/light.service; enabled; preset: enabled)
Active: inactive (dead)

呃,谁教你这么干的?!

你的用户服务就服务你这一个用户,哪来的多用户?一般写default.target就好了。

你真的发现了吗?还是你的幻觉?

user service 没有 multi-user 这么个 target,详见 arch wiki 以及 systemd 文档

因为程序运行后屏幕亮度会改变,所以很明显

然后为什么这么写吗,因为我是直接从wiki上抄来的

你是抄的系统服务吧?

屏幕亮度改变也可能是别的程序干的?服务运行了没有最直接的证据是systemd的日志。

emm我尝试了一下,发现把service移到系统文件夹/etc/systemd/system/就好了

我看还是一个权限问题

是是是,既然你看得这么准,以后你都自己看好了。再见。

和权限没有关系,这是把 user service 变成了 system service,详见 arch wiki Systemd/User 词条