我正在尝试创建一个脚本,该脚本打开多个gnome终端并打开一个netcat连接。几秒钟后,我希望关闭终端。我很茫然,我相信这是不可能的,但是我想我会问。
到目前为止,这是我所拥有的,但是在运行它之后,进程ID被认为是不正确的,并且我相信这是因为gnome-terminal将进程分叉到bash上,而我没有捕获该pid。
ipaddress=$1
port=$2
processarray=()
echo "netcat command set to ip: $ipaddress and port: $port"
if [ -z "$ipaddress" ]; then
echo "No ip address entered"
fi
if [ -z "$port" ]; then
echo "No port entered default set to 0"
$port=0
fi
for i in {0..9}; do
gnome-terminal -e "bash -c \"netcat $ipaddress $port; exec bash\"" & processarray+= ("$!")
done
sleep 10;
for i in "${processarray[@]}"; do
kill "$i"
done
那是因为gnome-terminal
是“聪明”。启动时gnome-terminal
,它将确定是否gnome-terminal
已在运行另一个实例。
gnome-terminal
进程并生成一个窗口。gnome-terminal
进程产生一个新窗口。因此,所有 gnome-terminal
窗口都使用单个PID作为单个进程运行。
您可以通过打开几个gnome-terminal
窗口轻松地检查此情况,然后通过在xprop _NET_WM_PID
某个位置发布并在其中单击来获取其PID 。您会看到所有窗口的PID都是相同的。
那么脚本中会发生什么呢?
您正在捕获gnome-terminal
启动的实例的PID ,但是问题是,这些PID仅存在了不到一秒的时间。这些过程只会导致现有gnome-terminal
过程产生一个新窗口,然后终止。
因此,如果您gnome-terminal
在执行脚本时已经拥有一个活动进程(我假设是这样),那么在尝试杀死它们时,您收集的PID将不再存在。如果不这样做(例如,您从一个xterm
或其他终端仿真器执行该脚本),则您收集的第一个PID确实是“正确的”。您收集的以下PID将是“不正确的”。进入终止循环后,第一次迭代将终止所有gnome-terminal
窗口,随后的迭代将输出错误,因为这些PID不再存在。
那么,如何解决呢?
好吧,我可以立即想到两种方法。
如果您不坚持使用gnome-terminal
,请改用其他终端模拟器,该模拟器不会以这种方式运行。xterm
例如,为每个窗口生成一个单独的进程。如果您使用xterm
而不是gnome-terminal
在脚本中使用它,那么它应该可以工作。容易&干净。
如果您确实坚持使用gnome-terminal
,杀死特定gnome-terminal
窗口的方法将是杀死在特定窗口内运行的进程。终止该过程后,该窗口将关闭。但是,由于您正在使用该-e
选项,因此该过程将netcat $ipaddress $port
首先进行,然后再进行bash
,并且很难获得PID。您目前无法像现在那样轻易地收集它们$!
。你可以尝试像killall netcat
或者killall bash
,但很明显,这也将终止所有其他netcat
或bash
情况下,你可能不希望。您可能可以grep
通过一些巧妙设计的ps
调用来尝试查找要杀死的确切PID,但这很不稳定且容易出错。老实说,我只想寻求解决方案1。
关于脚本的两个小注释:
第10行:应该port=0
,而不是$port=0
。
第13行:应该是processarray+=("$!")
,不是processarray+= ("$!")
。
希望能有所帮助。
编辑:哦,我刚刚找到的--disable-factory
选项gnome-terminal
,这导致它不重新使用现有进程。这是您的固定脚本:
#!/bin/bash
ipaddress=$1
port=$2
processarray=()
echo "netcat command set to ip: $ipaddress and port: $port"
if [ -z "$ipaddress" ]; then
echo "No ip address entered"
fi
if [ -z "$port" ]; then
echo "No port entered default set to 0"
port=0
fi
for i in {0..9}; do
gnome-terminal --disable-factory -e "bash -c \"netcat $ipaddress $port; exec bash\"" & processarray+=("$!")
done
sleep 10;
for i in "${processarray[@]}"; do
kill "$i"
done
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句