在 bash 中杀死 xterm 进程

在 bash 中杀死 xterm 进程

我想终止在脚本中以这种方式启动的 xterm 进程:

#!/bin/bash

echo "#!/bin/bash" > /tmp/test0
grep file | awk '{print "xterm -hold -e echo",$1,"sleep 10" && pid=$!}' >> /tmp/test0
echo "exit" >> /tmp/test0
chmod 700 /tmp/test0
bash /tmp/test0&
sleep 5
kill $pid  ---> does not work
exit

现在假设,我在同一个 bash (test0) 中以这种方式启动了几个 xterm,有没有办法将它们相应的 pid 存储在数组中,并在需要杀死它们时回调它们?此外,在存储这些值时,是否有办法将它们与另一个值(在本例中为 $1)关联起来,以便更容易回调。注意:$1 = 文本

非常感谢 !

答案1

当您使用以下命令运行脚本时:

bash /tmp/test0&

您正在启动一个完全独立的bash进程并将其置于后台。您看不到该脚本中定义的变量;它们属于另一个进程。如果您想访问另一个文件中定义的变量,请bash使用以下命令将该文件加载到当前进程中.source命令:

. /tmp/test0

之后,您将能够$pid在主脚本中输入并获取在其他文件中设置的值。


综上所述,您构建事物的方式非常令人费解。您发布的脚本有很多其他错误,我认为这些错误是由于编辑了问题的真实错误而导致的(您使用它时$!就好像它是一个awk变量,但随后期望将其复制到的变量在 Bash 脚本中定义) ,例如,并且test0会出现许多语法错误)。$!仅在 Bash 中定义使用 & 运行后台进程后:即使你的awk命令有效,$pid也会是空的。如果您想以这种方式获取xterm进程的 PID,则需要将其运行为xterm ... &.bash /tmp/test0 &test0脚本而不是命令置于后台xterm

看来你最好test0完全摆脱它,只xterm从主脚本启动。也许值得重新思考如何在更高的层面上处理事情。至少,看看你的真实test0文件中的内容,看看它是否是你真正想要的。

答案2

(您的 bash 脚本未运行,有错误)。

那么,为什么pid没有被杀死呢?是不是pid错了?或者也许你需要使用强制它杀死kill -9

然后,使用pgrep来获取pid。创建一个新的 xterm 并将 pid 存储在 xtermPid_1 中:

$ xtermPid_1=$(pgrep --newest xterm)

(看看 pgrep 的手册页,这是一个很好的工具)

相关内容