我有一个名为 runthunderbird 的 bash 脚本,它...运行 Thunderbird :
#!/bin/bash
sleep 5
thunderbird & disown
当我runthunderbird
从 krunner 执行时,Thunderbird 按预期在 5 秒后启动,然后进程结束,如Plasma 5.27.10 系统监视器中的进程列表runthunderbird
所示。ps -ef
但是,同一个系统监视器有一个“应用程序”选项卡,其中仍然列出了Thunderbird 的资源(例如内存)消耗,runthunderbird
而不是。thunderbird-bin
如果脚本在结束之前不只运行 Thunderbird,而是运行多个图形应用程序,则它们会在“应用程序”选项卡中集中在一起,再次位于(终止的)脚本的名称下。
我想知道这是如何管理的以及我应该如何编写脚本以将雷鸟与脚本完全分离而不是运行它。
我还想知道这个事实是否与当 runthunderbird 脚本在登录时从~/.config/autostart
.
答案1
它通过 cgroups 和 systemd 进行管理。 (也就是说,我 95% 确定它是通过 cgroups 和 systemd 管理的,尽管我没有在这里安装 KDE 来确认。)
最近,GNOME 和 KDE 都开始使用 systemd 对动态创建 .services 和 .scopes 的支持,以启动桌面应用程序(如果用户级别systemd --user
服务管理器运行时启动桌面应用程序。这是基于Linux的组组功能 – 每个 systemd .service 或 .scope 对应一个 Linux cgroup。 (Cgroup 早于 systemd,但在它之前几乎没有用处。)
一旦应用程序进程生成,他们就会要求 systemd 将其移至临时 .scope 单元(以及相应的新 cgroup)。稍后,任务管理器可以通过查看每个进程的 cgroup 名称/proc/<PID>/cgroup
并从中读取资源值/sys/fs/cgroup
(它还提供每个 cgroup 内的 PID 列表)。
看看systemd-cgls
或者loginctl user-status
看看生成的cgroup树;查看systemd-cgtop
每个 cgroup 资源计量的示例。您甚至可以在 htop 或 ps 中添加“Systemd 单元”列,例如ps -e -o pid,cmd,unit,uunit
。
您可能还会看到为每个组创建单独的 cgroup终端选项卡; GNOME 终端 (libvte) 和 tmux 现在可以执行此操作,我听说 Konsole 也可以执行此操作。 (除此之外,它允许每个选项卡有自己的任务限制;我已经在 GNOME 终端中成功运行了“bash smiley”forkbomb,系统的其余部分一直在运行。)
我想知道这是如何管理的以及我应该如何编写脚本以将雷鸟与脚本完全分离而不是运行它。
Cgroup 的创建是 a) 通过启动服务,b) 使用systemd-run --user
.要“分离”Thunderbird,您可以使用:
systemd-run --user [--scope] --collect /bin/thunderbird
(……或者您可以在您的系统中创建一个真正的“thunderbird.service”~/.config/systemd/user/
并使用 运行它systemctl --user start
。与“thunderbird.timer”相结合来延迟启动,将完全消除对脚本的需要。)
使用--scope
和-u/--unit="app-foo-bar"
使其更类似于 GNOME 和 KDE 所做的事情。 Systemd-run默认是创建一个.service;区别在于 .service 单元始终由 systemd 本身生成其进程,而 .scope 允许调用者移动已经运行的进程。
这也意味着在作用域模式下,命令仍将“在前台”运行,除非您&
照常运行,而在服务模式下,它将始终“在后台”运行,并且您需要明确询问-t/--pty
是否要运行交互式终端应用程序,或者-P/--pipe
程序不一定是交互式的,但您仍然想查看其输出;否则所有标准输出都会进入系统日志(journalctl)。
这-G/--collect
只是防止陈旧的单位徘徊。
Systemd-run 可用于为潜在的大型任务指定 cgroup 级别的内存限制,而不会导致整个系统出现 OOM 风险 - 请查看参数-p/--property
。