Bash。恢复后台命令的标准错误
Bash. recover stderr of a background command
我在我的 bash 脚本中在后台启动命令。我需要在 var 中恢复它的 stderr,但不知道如何。帮助! :D
#!/bin/bash
existingdestiny="8.8.8.8" #this is google dns for the example
ping -c 1 $existingdestiny -W 1 > /dev/null 2>&1
exitvar=$?
echo "exitvar: $exitvar"
nonexistingdestiny="172.16.0.234" #this is a non accesible ip example
ping -c 1 $nonexistingdestiny -W 1 > /dev/null 2>&1
exitvar=$?
echo "exitvar: $exitvar"
这行得通,returns 0 然后 1,这是正确的,很好!但是如果我把命令放在后台,我就不能接受标准输出。让我们看看:
#!/bin/bash
existingdestiny="8.8.8.8" #this is google dns for the example
ping -c 1 $existingdestiny -W 1 > /dev/null 2>&1 &
exitvar=$?
echo "exitvar: $exitvar"
nonexistingdestiny="172.16.0.234" #this is a non accesible ip example
ping -c 1 $nonexistingdestiny -W 1 > /dev/null 2>&1 &
exitvar=$?
echo "exitvar: $exitvar"
它returns0和0哪个不正确。我怎样才能得到正确的回复?
您需要记录后台进程的PID,然后调用wait
收集return状态。
ping -c 1 $nonexistingdestiny -W 1 > /dev/null 2>&1 &
ping_pid=$!
wait $ping_pid
exitvar=$?
echo "exitvar: $exitvar"
(我想你想要 return 状态,而不是文件描述符 2 上的 stderr
。
退出代码和标准错误输出(也称为"stderr")是两个不同的东西。标准错误输出是一个输出流,任何程序都可以向其写入任何它想要的内容。退出代码(也称为退出状态)是由进程编辑的整数 return。
根据问题中的代码片段,我假设您想获取退出代码。
特殊的 shell 符号 $?确实 return 最后启动命令的退出代码。但是,这不适用于通过 & 在后台启动的命令。这是因为命令在后台启动,尚未完成。即使它已经完成,shell 也不会知道。
为了通过 & 获取在后台启动的命令的退出代码,您必须使用 wait 命令。等待命令的退出代码将恰好是所等待命令的退出代码。等待命令将等待后台进程完成。如果后台进程已经终止,则立即等待命令 returns。
为了使用等待命令,您需要知道后台进程的进程ID。您可以使用 $! 获取在后台启动的命令的进程 ID。特殊符号。因此,以下代码将执行您想要的操作:
COMMAND &
pid="$!"
# Optional: Do something else while ping runs
wait "$pid"
exitcode="$?"
echo "exitcode=$exitcode"
但是请注意,ping 命令本身不会停止,因此在后台启动 ping 并等待它只会挂起。
我建议不要 运行 在后台执行 ping 操作。您已经正确使用选项 -c 和 -W 以确保 ping 不会挂起。
我在我的 bash 脚本中在后台启动命令。我需要在 var 中恢复它的 stderr,但不知道如何。帮助! :D
#!/bin/bash
existingdestiny="8.8.8.8" #this is google dns for the example
ping -c 1 $existingdestiny -W 1 > /dev/null 2>&1
exitvar=$?
echo "exitvar: $exitvar"
nonexistingdestiny="172.16.0.234" #this is a non accesible ip example
ping -c 1 $nonexistingdestiny -W 1 > /dev/null 2>&1
exitvar=$?
echo "exitvar: $exitvar"
这行得通,returns 0 然后 1,这是正确的,很好!但是如果我把命令放在后台,我就不能接受标准输出。让我们看看:
#!/bin/bash
existingdestiny="8.8.8.8" #this is google dns for the example
ping -c 1 $existingdestiny -W 1 > /dev/null 2>&1 &
exitvar=$?
echo "exitvar: $exitvar"
nonexistingdestiny="172.16.0.234" #this is a non accesible ip example
ping -c 1 $nonexistingdestiny -W 1 > /dev/null 2>&1 &
exitvar=$?
echo "exitvar: $exitvar"
它returns0和0哪个不正确。我怎样才能得到正确的回复?
您需要记录后台进程的PID,然后调用wait
收集return状态。
ping -c 1 $nonexistingdestiny -W 1 > /dev/null 2>&1 &
ping_pid=$!
wait $ping_pid
exitvar=$?
echo "exitvar: $exitvar"
(我想你想要 return 状态,而不是文件描述符 2 上的 stderr
。
退出代码和标准错误输出(也称为"stderr")是两个不同的东西。标准错误输出是一个输出流,任何程序都可以向其写入任何它想要的内容。退出代码(也称为退出状态)是由进程编辑的整数 return。
根据问题中的代码片段,我假设您想获取退出代码。
特殊的 shell 符号 $?确实 return 最后启动命令的退出代码。但是,这不适用于通过 & 在后台启动的命令。这是因为命令在后台启动,尚未完成。即使它已经完成,shell 也不会知道。
为了通过 & 获取在后台启动的命令的退出代码,您必须使用 wait 命令。等待命令的退出代码将恰好是所等待命令的退出代码。等待命令将等待后台进程完成。如果后台进程已经终止,则立即等待命令 returns。
为了使用等待命令,您需要知道后台进程的进程ID。您可以使用 $! 获取在后台启动的命令的进程 ID。特殊符号。因此,以下代码将执行您想要的操作:
COMMAND &
pid="$!"
# Optional: Do something else while ping runs
wait "$pid"
exitcode="$?"
echo "exitcode=$exitcode"
但是请注意,ping 命令本身不会停止,因此在后台启动 ping 并等待它只会挂起。
我建议不要 运行 在后台执行 ping 操作。您已经正确使用选项 -c 和 -W 以确保 ping 不会挂起。