我使用一项systemd
服务在 Ubuntu 20.04 启动时启动几个进程。
# MyApp start app service
[Unit]
Description=MyApp start service
Requires=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStartPre=/bin/sleep 20
ExecStart=/etc/init.d/MyApp.sh start
ExecStop=/etc/init.d/MyApp.sh stop
LimitMEMLOCK=infinity
LimitCORE=infinity
RemainAfterExit=yes
User=admin
[Install]
#WantedBy=multi-user.target
#WantedBy=graphical.target
WantedBy=basic.target
我的所有进程都在系统启动后启动。然而,几分钟后,用户级systemd
退出并删除了我的进程创建的所有信号量。
看来我可以设置RemoveIPC=No配置来/etc/systemd/logind.conf
阻止用户systemd
删除信号量。
但是,用户为什么会systemd
退出?我应该使用命令sudo loginctl enable-linger admin
来阻止它退出吗?
谢谢!
基于以下事实:
enable-linger
WantedBy=
的适当目标,并用和公交车--system
共有的可疑目标替换它们。--system
--user
ExecStartPre=/bin/sleep 20
我非常确定你的单元是在
--user
总线上运行的。在这种情况下User=admin
,会被忽略,正确的目标是非WantedBy=default.target
GUI 服务或WantedBy=graphical-session.target
GUI 服务。既然你已经WantedBy=graphical.target
注释掉了,我猜你应该使用WantedBy=graphical-session.target
。但主要问题是
Type=simple
和RemainAfterExit=yes
。Type=simple
会导致单元在MyApp.sh start
退出时停止。RemainAfterExit=yes
这仅适用于Type=oneshot
您希望单元ExecStart=
提前退出,但希望单元保持“运行”状态直到您执行停止操作的情况。正如 Marcus Muller 所建议的,Type=forking
这很可能就是您想要的,因为启动/停止参数类似于传统的 SysV 守护进程。总的来说,这就是我要做的:
记下服务的路径。它位于
*/user/
目录中。然后systemctl --user enable --now myapp.service
(不要使用sudo
)。这将导致程序仅在登录用户拥有桌面会话后启动。仅
Limit*=
在您确定一切正常后(且仅在需要时)才重新添加这些内容。network-online.target
用户总线上不提供此功能,因此您只需要确保应用程序具有一些处理功能,以便在发生故障时自行connect()
重置bind()
。