我想rofi
用一个按键绑定切换应用程序启动器。我做了一个shell脚本,
#!/bin/bash
rofi -dpi 1 -modi drun -show drun -show-icons
并将其绑定到某个键。这可行,但要将其切换回不运行,我尝试过:
pkill -0 rofi || rofi -dpi 1 -modi drun -show drun -show-icons
这不会让 rofi 开始。我测试了一下pkill emacs || emacs
,确实可以切换 emacs。有人可以告诉我如何修复 rofi 吗?而且,参数“-0”有什么作用?我在手册中找不到它。
我确实找到了这,
我花了相当多的时间来解决这个问题,然后我意识到 rofi 存储了它的 pid。我们可以通过配置访问 pid 文件,这反过来又使我们能够访问我们需要的所有信息。不过,在开始讨论令人兴奋的内容之前,有必要提一下安全性。 (以某种方式)限制进程数量是一个非常好的主意,以防您创建失控的脚本。根据经验,可能需要半个小时才能释放足够的内存来切换到另一个 tty 并杀死所有内容。
if [[ 10 -lt $(pgrep -c -f "$0") ]]; then
pkill -f rofi
pkill -f "$0"
exit 1
fi
我不确定这是否正是我想要的,或者该代码的作用是什么。
答案1
tl;dr:事实上,您的代码表示“如果 pkill 找不到rofi
我们可以杀死的进程,则运行rofi
”。它实际上并没有说如果它已经在运行就杀死它,只是粗略地检查它是否正在运行,如果没有,则启动它。如果你真的希望它每次都杀死它,请删除-0
.
-0
Kills 信号为 0,只是检查调用进程是否有权限杀死该进程,以及该进程是否存在。它实际上并没有杀死任何东西。
从man 3 kill
:
如果 sig 为零(空信号),则执行错误检查,但实际上不发送任何信号。空信号可用于检查pid的有效性。
以这种方式传递信号记录在此处man pkill
(有点不清楚-signal
,实际上是-[signal]
):
-信号--信号信号:定义发送到每个匹配进程的信号。可以使用数字或符号信号名称。
如果要终止进程,请使用pkill
without-0
来使用默认信号 ( SIGTERM
),或传递另一个信号名称或编号来使用它。
附带说明一下,这种处理应用程序生命周期的方法非常基本,并且可能会因多种原因而失败(例如,不同步,因此如果您替换为,kill
则不能保证前一个rofi
会在下一个出现之前消失)-0
致命信号)。因此,理想情况下最好让应用程序本身或服务管理器更可靠地处理此问题。