首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可持续pid变量$!使用yad是错误的吗?

可持续pid变量$!使用yad是错误的吗?
EN

Stack Overflow用户
提问于 2021-04-18 16:50:13
回答 1查看 256关注 0票数 0

我试图在bash脚本中使用杀死命令关闭yad窗口,但是pids总是不匹配。命令行上也一样。

代码语言:javascript
复制
$ yad & pid_01=$!
$ kill $pid_01
bash: kill: (31879) - Kein passender Prozess gefunden
$ echo $(pidof yad)
31880
$ echo $!
31879

没有其他yad进程正在运行。

  1. 这是怎么回事?为什么这个pid总是错误的?(因此窗口无法关闭)
  2. 如何在多个yad进程运行时可靠地找到特定yad窗口的pid?或者是否有其他方法从bash脚本中关闭yad窗口?因为“杀死$(pidof yad )”可能会随机关闭另一个yad窗口。

我有点困惑,因为我没有注意到之前的其他程序有这个问题。

任何帮助都很感激。

GNU,版本5.0.3(1)-release (i 686-pc-linux-gnu) yad -版本0.40.0 (GTK+ 3.24.5)

EN

回答 1

Stack Overflow用户

发布于 2021-04-20 02:50:19

( 1.)简单的回答:不,pid本身是正确的,但与运行窗口的yad进程不匹配。有两个用于yad的pids,因为yad显然是由某些包装器脚本调用的,而不是在命令行或脚本中直接输入“yad”。这可能是发行版的具体内容。

代码语言:javascript
复制
$ 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

验证:

代码语言:javascript
复制
$ cat /usr/local/bin/yad
#!/bin/bash

/usr/bin/yad "$@" 2>/dev/null

因此,选项-x将显示这两个pids。

代码语言:javascript
复制
$ pidof -x yad
29524 29523

在处理yad存在的多个实例(例如,用户多次调用脚本)时,这一点也没有帮助;在ps中存在一些相同的yad进程:

代码语言:javascript
复制
$ 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:

代码语言:javascript
复制
# 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版本上工作。

如果有人能提供一个更优雅的解决方案,请解释。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67151112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档