Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
变量和终止过程中的Bash存储命令PID_Bash_Variables_Process_Kill - Fatal编程技术网

变量和终止过程中的Bash存储命令PID

变量和终止过程中的Bash存储命令PID,bash,variables,process,kill,Bash,Variables,Process,Kill,我想使用shell脚本来建立以太网连接 我使用的函数实现为: function connec() { ip link set eth0 up sleep 5 udhcpc -i eth0 pid=$$ echo $pid ps kill -9 $pid } 但是,脚本返回: 743 743 root 2704 S {script.sh} /bin/bash ./script.sh connect 767 root

我想使用shell脚本来建立以太网连接

我使用的函数实现为:

function connec()
{
    ip link set eth0 up
    sleep 5
    udhcpc -i eth0
    pid=$$
    echo $pid
    ps 
    kill -9 $pid
}
但是,脚本返回:

743
743 root      2704 S    {script.sh} /bin/bash ./script.sh connect
767 root      2200 S    udhcpc -i eth0
Killed
我在767店而不是743店没有成功。我还尝试使用$!但在这种特定情况下,“echo$pid”返回0

$$
是当前进程,这意味着脚本正在自毁。您可以使用
$获取在后台启动的上一个进程的进程ID但是看起来你并没有真正开始这些

使用您的代码段:

udhcpc -i eth0
pid=$$
pid=
行仅在
udhcpc
退出时执行(或者后台程序本身,在这种情况下,
$
$!
都不会工作),因此尝试终止进程是没有意义的

要在后台运行它并存储其进程ID,以便您可以继续在父进程中运行,您可以使用以下方法:

udhcpc -f -i eth0 &
pid=$!
udhcpc -i eth0 -p /tmp/udhcpc.eth0.pid
pid=$(cat /tmp/udhcpc.eth0.pid)
在这种情况下,您将使用
-f
在前台运行,因为您将接管正常的作业控制

或者,由于
udhcpc
可以创建自己的PID文件,因此您可以使用以下内容:

udhcpc -f -i eth0 &
pid=$!
udhcpc -i eth0 -p /tmp/udhcpc.eth0.pid
pid=$(cat /tmp/udhcpc.eth0.pid)

比paxdiablo更感谢你的回答。使用“udhcpc-ieth0&”可以工作,但我注意到一个奇怪的行为。实际上,echo$pid返回正确的进程号并执行udhcpc命令。我在pid=$之间添加了睡眠!为了让udhpc有足够的时间完全执行,但是kill-9$pid返回kill:(1813)-没有这样的进程,因为进程号已经更改了?我不知道为什么!!?问题在于每次出现connect()时,都会创建一个新的udhcpc进程。。我认为killall-udhcpc是一个解决方案,但确实是一个合适的解决方案?@SnP,它可能正在后台监控自身(启动另一个进程来完成繁重的工作,并退出您启动的进程)。这就解释了即使进程仍在运行,也会丢失进程的原因。您得到的PID是直接的子进程,剩下运行的进程是孙子进程。或者添加
-f
来停止,或者使用我提供的PIDfile解决方案可能更好。在上述情况下,我认为您不需要在后台运行
udhcpc
,然后使用pid终止。如果希望有一些
超时
,允许进程运行,请使用命令本身。如果命令
udhcpc
在前台运行,则下一个命令将仅在该命令完成后运行。因此,您不必使用pid终止该命令。