gpt4 book ai didi

linux - 如何在 Linux 终端中显示 GUI 应用程序的窗口标题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:14 26 4
gpt4 key购买 nike

我在我的shell脚本中定义了一个叫pk的交互函数来杀掉程序,比如pk emacs来杀掉emacs程序,但是如果有多个实例在运行,那就问您可以选择 pid 来杀死或全部杀死它们。

这偶尔会发生在我的一个 Emacs 死机时,因为我公司的 CentOS 很旧,但是在我的脚本函数 pk 中,我使用 ps 来过滤命令和他们的 PID,AFAIK ps 在这种情况下没有告诉窗口标题,它只是打印一个或多个“/usr/bin/emacs”,没有更多细节,我不知道哪个 PID 卡住或没有-我要杀死的响应。

我知道我可以使用像 System Activity(KDE) 这样的系统工具来检查窗口标题并终止程序,但我想在终端中使用 pk 终止程序函数,所以是否有类似 ps 但显示“window-title + command + pid”的工具,以便我可以在我的脚本中使用它来终止该程序。

因为如果你从终端使用 vim 或 emacs 打开文件,带有选项的 ps 将显示它正在编辑的文件,所以我知道 PID 的详细信息并知道要杀死哪个,所以在这里,窗口标题就像System Activity中的窗口标题。

当然,如果获得寡妇头衔的方法不对,如果有人像我说的那样知道如何杀死同一个程序的多个实例之一,欢迎回答。

最佳答案

我刚刚找到了另一个解决方案,我可以在我的 pk 函数中使用以下行来终止卡住的 emacs:

kill -SIGUSR2 (xprop | grep -i pid | grep -Po "[0-9]+")

当您使用鼠标单击 GUI 程序时,(xprop...) 部分将返回 PID。

如果有人对我的 pk 函数感兴趣,请看这里(注意我使用的是 fish-shell,所以这是 fish 脚本函数):

function pk --description 'kill processes containg a pattern'
set done 1
set result (psg $argv[1] | wc -l)
if test $result = 0
echo "No '$argv[1]' process is running!"
else if test $result = 1
psg $argv[1] | awk '{print $2}' | xargs kill -9
if test $status = 123 # Operation not permitted
read -p 'echo "Use sudo to kill it? [y/N]: "' -l arg
if test "$arg" = "y"
psg $argv[1] | awk '{print $2}' | xargs sudo kill -9
end
end
else
psg $argv[1]
while test $done = 1
read -p 'echo "Kill all of them or specific PID? [y/N/pid]: "' -l arg
if test "$arg" = "y"
psg $argv[1] | awk '{print $2}' | xargs kill -9
if test $status -eq 123 # Operation not permitted
read -p 'echo "Use sudo to kill them all? [y/N]: "' -l arg2
if test "$arg2" = "y"
psg $argv[1] | awk '{print $2}' | xargs sudo kill -9
end
end
set done 0
else if test $arg -a "$arg" != "y" -a "$arg" != "n"
# the fist cond in test means you typed something, RET will not pass
if test (psg $argv[1] | awk '{print $2}' | grep -i $arg)
kill -9 $arg #2>/dev/null
if test $status -eq 1 # kill failed
read -p 'echo "Use sudo to kill it? [y/N]: "' -l arg2
if test "$arg2" = "y"
sudo kill -9 $arg
end
end
echo -e "Continue...\n"
usleep 100000
psg $argv[1]
else if test "$arg" = "p"
# This may be used for frozen emacs specifically, -usr2 or -SIGUSR2
# will turn on `toggle-debug-on-quit`, turn it off once emacs is alive again
# Test on next frozen Emacs
kill -SIGUSR2 (xprop | grep -i pid | grep -Po "[0-9]+")
# kill -usr2 (xprop | grep -i pid | grep -Po "[0-9]+")
return
else
echo "PID '$arg[1]' is not in the list!"
echo
end
set done 1
else
# RET goes here, means `quit` like C-c
set done 0
end
end
end
end

关于linux - 如何在 Linux 终端中显示 GUI 应用程序的窗口标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44712393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com