为了账号安全,请及时绑定邮箱和手机立即绑定

Systemctl(?) 杀死分离的屏幕

Systemctl(?) 杀死分离的屏幕

Go
函数式编程 2022-08-01 15:28:04
我有一个用Go编写的程序,它以编程方式创建和管理屏幕。下面是一个示例:_, err := exec.Command("screen", "-S", "screen-"+strings.ToLower(name), "-X", "stuff", command+"\n").Output()这工作正常。当我控制+C程序时,创建的屏幕保持打开状态(我想要的!但是,我已将其转换为 Ubuntu 上的后台服务。当我运行时,它会在没有警告的情况下杀死那些屏幕。附加到屏幕也不会阻止此操作(立即转到 )。但是,它不会杀死外部创建的屏幕。systemctl stop <service>[screen terminated]这是我的:.service[Unit]Description=>servicename> background serviceAfter=network-online.target[Service]ExecStart=/usr/lib/<servicename>/service[Install]WantedBy=multi-user.target我:rules%:    dh $@ --with systemd --paralleloverride_dh_auto_install:    dh_auto_install    dh_systemd_enable || true    dh_systemd_start || true我:controlPackage: <name>Version: 0.2Architecture: amd64Priority: optionalMaintainer: <me>Description: <description>Depends: screen, iptablesBuild-Depends: dh-systemd (>=1.5)我无法想象什么会导致这些屏幕死亡。我很确定它们没有被附加到程序中,因为它作为可执行文件运行良好。系统日志中除了“服务已停止”和“服务已启动”之外,未提及任何内容。我尝试过在root下制作屏幕,不同的用户,运行空屏幕与运行程序等。没什么值得注意的。有什么想法吗?
查看完整描述

1 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

systemd默认情况下,如果创建进程(Go 程序)的主服务(Go 程序)退出,则终止所有进程(屏幕)。请注意,这不仅是子进程,而且是同一 cgroup 中的任何进程。这是为了确保如果服务崩溃,它没有剩余的进程。

可以使用单元文件中的键来控制此行为,此处对此进行了介绍。尽管不建议将其设置为 或 (以使屏幕不受管理并逃避服务生命周期管理)。KillMode=.serviceprocessnonesystemd


查看完整回答
反对 回复 2022-08-01
  • 1 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信