我的当前配置用途
kdesu shutdown -[rh] now
重新启动/关闭。整个关机过程大约需要1-2秒。但每次启动后,Firefox 都会说它被提前关闭,这很可能表明它被残酷地谋杀了,而不是安息了。如何配置“正常”WM 关闭程序(类似于kill -SIGTERM && sleep 10 && kill -SIGKILL
,但最好使用现有的工具)在很棒的 WM 中?
答案1
wmctrl
可能会帮助你(包名wmctrl
)。
wmctrl
帮助您与 EWMH/NetWM 兼容的 X Window Manager 进行交互。我不确定 AwesomeWM 是否符合这个描述,但如果符合这个描述,这个答案就有效。
$ wmctrl -l
0x0100002d 1 stewbian arch linux - How to reboot/shut down gracefully in Awesome WM? - Unix & Linux Stack Exchange — Mozilla Firefox
0x01200007 0 stewbian ~ : bash — Konsole
$ wmctrl -c 0x01200007
可以编写脚本来列出所有窗口 ( wmctrl -l
)、迭代列表并关闭每个窗口 ( wmctrl -c
)。完成后,然后关闭。
#!/bin/bash
wmctrl -l | awk '{ print $1 }' | while read -r windowid; do
wmctrl -c $windowid
done
shutdown -h now
如果这不起作用, wmctrl
可以获取父进程的 PID,您可以kill
向每个 PID 发送信号 ( )。
#!/bin/bash
pids=$(wmctrl -lp | awk '{print $3}')
kill -SIGTERM $pids
sleep 2
pids=$(wmctrl -lp | awk '{print $3}')
kill -SIGKILL $pids
sleep 2
shutdown -h now
您还可以按进程拆分它。您可以将 SIGTERM 发送到标题栏中带有 Firefox 的窗口,但将 SIGINT 发送到 QtCreator 的实例,然后将 SIGABRT 发送到其他所有内容,包括 Firefox 和 QtCreator(如果它们仍然存在)。
#!/bin/bash
pids=$(wmctrl -lp | awk '/Firefox/{print $3}')
kill -SIGTERM $pids
pids=$(wmctrl -lp | awk '/Qt Creator/{print $3}')
kill -SIGINT $pids
sleep 10
pids=$(wmctrl -lp | awk '{print $3}')
kill -SIGABRT $pids
shutdown -h now
答案2
您可能希望以有序的方式结束会话。 SuperUser 的这个答案似乎可以实现这一点: https://superuser.com/questions/395820/how-to-properly-end-a-kde-session-from-shell-without-root-privileges