Categories: Shell业界编程

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上执行了一些命令,并希望睡眠一段时间,因为我希望从执行的命令中得到一些输出,这些输出将用于当前进程的进一步执行。

5.0
01
wordpress如何获取文章或者页面最后更新时间?
linux lsmod命令
嘻嘻

嘻嘻IT: 笔者是一个工作七八年的程序猿老鸟,从事涉及的技术栈主要包括PHP、Linux、Devops等,喜欢研究新技术,尝试新技术,提升技术自动化和开发效率,致力于write less,do more! 技术每年都会层出不穷,领域划分的越来越细,不可能学习所有的东西,保持对技术的好奇心,理解技术中核心思想,做一个有深度,有思想的开发!

Recent Posts

全球货币导航网页上线了!

o在全球化的今天,货币兑换和国…

3小时 ago

bash字符串拼接

在编程中,字符串的拼接是一个非…

4小时 ago

Bash Case详解

Bash case 语句通常用…

4小时 ago

Bash for详解

for循环是编程语言中的基础概…

4小时 ago

liunux中你必须知道alias命令?

在Linux操作系统中,无论你…

1天 ago

zshrc文件详解

Zsh 是一个强大的 shel…

2天 ago