我想终止在脚本中以这种方式启动的 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 的手册页,这是一个很好的工具)