Linux wait命令及其示例
Wait是一个shell命令,它等待给定进程完成,然后返回其退出状态。Wait命令用于等待特定进程ID和作业ID并返回其终止状态。
在执行大的自动化流程时,我们需要让几个模块等待上一组模块完成,并将数据以流水线方式返回到下一个模块,在这种情况下,我们可以使用wait命令直到完成上一个模块。
wait命令的工作原理
Wait命令用于监视上一个进程,取决于上一个进程的返回状态,它将返回退出状态。例如,如果我们想等待完成一个特定的进程ID 13245,那么当进程13245 complete wait命令返回13245 exit status的返回值时,我们应该使用“wait 13245”。
- wait PID(PID—命令的进程ID,实用程序将为其等待终止)。
- wait JID(JID—标识要等待的后台进程的作业ID,仅适用于当前shell执行环境中的wait调用)。
wait命令的退出状态值取决于最后指定的PID/JID。当任何进程异常终止时,退出状态将大于128。
当Wait命令在没有子进程的情况下调用并且当前shell已知所有进程ID都已终止时,Wait命令将以值0退出。如果wait命令检测到任何错误,则返回1到126之间的任何值。如果最后一个进程id未知,则wait命令将以值127退出。
wait命令示例
让我们检查几个脚本以了解wait命令是如何工作的。
示例:1–带有Wait命令的脚本
我们有两个脚本,分别是“foo.sh”和“bar.sh”脚本“Foo.sh”脚本打印1到5之间的数字和“bar.sh”脚本将调用Foo.sh并在后台运行它,获取Foo.sh的PID并等待它完成,一旦完成,它将启动“bar.sh”循环并完成。
脚本–foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo “foo.sh – Looping … number $i”
done
脚本–bar.sh
#!/bin/bash
echo “Started bar.sh”
echo “Started foo.sh”
./foo.sh &
pid=$!
wait $pid
echo “Completed foo.sh”
for I in 1 2 3 4 5
do
echo “bar.sh – Looping … number $i”
done
结果
Started bar.sh
Started foo.sh
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
Completed foo.sh
bar.sh – Looping .. number 1
bar.sh – Looping .. number 2
bar.sh – Looping .. number 3
bar.sh – Looping .. number 4
bar.sh – Looping .. number 5
Completed bar.sh
$
示例2–不带等待命令的脚本
我们有两个脚本,分别是“foo.sh”和“bar.sh”脚本“foo.sh”脚本打印1到5之间的数字,bar.sh脚本将调用foo.sh并在后台运行,但它不会等待foo.sh完成并执行这两个脚本。
脚本–foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo “foo.sh – Looping … number $i”
done
脚本–bar.sh
#!/bin/bash
echo “Started bar.sh”
echo “Started foo.sh”
./foo.sh &
echo “Completed foo.sh”
for I in 1 2 3 4 5
do
echo “bar.sh – Looping … number $i”
done
结果
Started bar.sh
Started foo.sh
Completed foo.sh
bar.sh – Looping .. number 1
bar.sh – Looping .. number 2
bar.sh – Looping .. number 3
bar.sh – Looping .. number 4
bar.sh – Looping .. number 5
Completed bar.sh
$
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
$
示例:3–具有等待命令和返回状态的脚本
“bar.sh”脚本将调用foo.sh并在后台运行,获取foo.sh的PID并等待其完成,完成后将启动bar.sh循环并完成,最后返回foo.sh脚本的退出代码。
脚本–foo.sh(退出状态=0)
脚本-foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo “foo.sh – Looping … number $i”
done
脚本–bar.sh
#!/bin/bash
./foo.sh &
BPID=$!
wait $BPID
stat=$?
if [ $stat –eq 0 ]
then
echo “Exit status - $stat”
else
echo “Exit status - $stat”
fi
结果
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
Exit status - 0
$
脚本–foo.sh(退出状态=非零)
脚本-foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
iiecho “foo.sh – Looping … number $i”
done
脚本–bar.sh
#!/bin/bash
./foo.sh &
BPID=$!
wait $BPID
stat=$?
if [ $stat –eq 0 ]
then
echo “Exit status - $stat”
else
echo “Exit status - $stat”
fi
结果
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
Exit status – 127
$
结论
Wait和Sleep都是操作系统中基于时间的系统调用。让我们检查一下wait和sleep命令之间的区别。
wait:当用户想要停止当前进程,并且它释放该进程持有的所有资源并等待其他进程执行时。我们需要使用notify使该流程意识到在其他流程完成后再次开始执行。
Sleep:当用户想要暂停当前进程一段时间时,使用此系统调用。它会将锁保持在资源上,直到睡眠时间结束,然后再次开始执行进程。在这里,流程可以控制整个执行过程。eg.我在bash上执行了一些命令,并希望睡眠一段时间,因为我希望从执行的命令中得到一些输出,这些输出将用于当前进程的进一步执行。