为什么 pkill 不能与 rofi 一起使用?

为什么 pkill 不能与 rofi 一起使用?

我想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.


-0Kills 信号为 0,只是检查调用进程是否有权限杀死该进程,以及该进程是否存在。它实际上并没有杀死任何东西。

man 3 kill

如果 sig 为零(空信号),则执行错误检查,但实际上不发送任何信号。空信号可用于检查pid的有效性。

以这种方式传递信号记录在此处man pkill(有点不清楚-signal,实际上是-[signal]):

-信号--信号信号:定义发送到每个匹配进程的信号。可以使用数字或符号信号名称。

如果要终止进程,请使用pkillwithout-0来使用默认信号 ( SIGTERM),或传递另一个信号名称或编号来使用它。

附带说明一下,这种处理应用程序生命周期的方法非常基本,并且可能会因多种原因而失败(例如,不同步,因此如果您替换为,kill则不能保证前一个rofi会在下一个出现之前消失)-0致命信号)。因此,理想情况下最好让应用程序本身或服务管理器更可靠地处理此问题。

相关内容