我试图在bash脚本中使用杀死命令关闭yad窗口,但是pids总是不匹配。命令行上也一样。
$ yad & pid_01=$!
$ kill $pid_01
bash: kill: (31879) - Kein passender Prozess gefunden
$ echo $(pidof yad)
31880
$ echo $!
31879没有其他yad进程正在运行。
我有点困惑,因为我没有注意到之前的其他程序有这个问题。
任何帮助都很感激。
GNU,版本5.0.3(1)-release (i 686-pc-linux-gnu) yad -版本0.40.0 (GTK+ 3.24.5)
发布于 2021-04-20 02:50:19
( 1.)简单的回答:不,pid本身是正确的,但与运行窗口的yad进程不匹配。有两个用于yad的pids,因为yad显然是由某些包装器脚本调用的,而不是在命令行或脚本中直接输入“yad”。这可能是发行版的具体内容。
$ yad -- info & echo $!
29523
$ pidof yad
29524
$ ps x | grep 'yad' | grep -v 'grep'
29523 pts/0 S 0:00 /bin/bash /usr/local/bin/yad -- info
29524 pts/0 S 0:00 /usr/bin/yad -- info验证:
$ cat /usr/local/bin/yad
#!/bin/bash
/usr/bin/yad "$@" 2>/dev/null因此,选项-x将显示这两个pids。
$ pidof -x yad
29524 29523在处理yad存在的多个实例(例如,用户多次调用脚本)时,这一点也没有帮助;在ps中存在一些相同的yad进程:
$ yad -- info
$ yad
$ yad -- info
$ ps x | grep 'yad' | grep -v 'grep'
22928 pts/0 S 0:00 /bin/bash /usr/local/bin/yad -- info
22929 pts/0 S 0:00 /usr/bin/yad -- info
23131 pts/0 S 0:00 /bin/bash /usr/local/bin/yad
23132 pts/0 S 0:00 /usr/bin/yad
24633 pts/0 S 0:00 /bin/bash /usr/local/bin/yad -- info
24634 pts/0 S 0:00 /usr/bin/yad -- info( 2.)我的解决方案可以可靠地找到来自上述分析的具体yad窗口的两个pids:
# get yad pid of specific yad window
yad_pid_before="$(pidof -x yad) "
yad --info & \
sleep 1
yad_pid="$(pidof -x yad)"
if [ "$yad_pid_before" != " " ]; then
while read -d' ' item
do
yad_pid="$(echo "$yad_pid" | sed "s/$item//g")"
done <<<"$yad_pid_before"
fi
#testing
echo -e "yad recent window pids:\t$yad_pid\nsleeping 6s before closing."
sleep 6
kill $yad_pid问题描述:
Yad是在至少一些发行版中使用包装器脚本的。所以“杀了$!”都会失败。替代“ps”没有提供足够的信息来区分使用相同选项调用的多个yad窗口。
解释解决办法:
所有现有yad进程的pids都存储在“$yad_pid_before”中,就在执行新的yad窗口之前。为了查找字符串中的最后一项,需要使用空后缀字符。获得脚本pids的选项-x是必需的。
第二个(重要的) pid没有立即出现,并且无法提前注册,所以“睡眠1”等待它。
在启动新的yad窗口后,将所有$yad_pid存储在“$yad_pid”中。
从“$yad_pid_before”中删除“yad_pid”中的任何pid,同时从这里-string循环列表。
只在“$yad_pid_before”中至少有一项存在时,才需要执行循环,否则sed命令将失败。有条件的分支会处理这个问题。
产生的变量“$yad_pid”包含最近的两个pids,现在可以用于脚本中的杀死命令,以关闭在第二行打开的特定yad窗口。任何其他的yad窗口,无论是打开之前或之后,都不会受到影响。
至少在原始问题中指定的bash和yad版本上工作。
如果有人能提供一个更优雅的解决方案,请解释。
https://stackoverflow.com/questions/67151112
复制相似问题