命令链:内联或已运行进程

linuxopen sourceoperating system更新于 2026/1/27 17:22:17

概述

有时您可能希望在 Linux 中顺序运行多个命令。为此,您可以使用命令链。例如,如果您要下载一个压缩包,解压它,然后从磁盘中删除生成的压缩包,则可以同时输入这三个命令。

在这里,我们将介绍一些在 Linux 中使用 Bash 序列化命令的方法。即使这些命令已经在运行中。

内联命令链

Bash 为最终用户提供了极大的灵活性和强大的功能。我们可以创建长序列的指令来执行任意数量的任务。

<command1> <arguments1> <chaining operator> <command2> <arguments2> ...

链式操作包含几种常见的操作,我们将在这里进行介绍。

  • ;(分号) − 最右侧的命令始终在最右侧的命令之后运行,即使后者失败也是如此。

  • &(与号)− 左侧有一个"在后台运行"选项;右侧有一个"立即启动"选项。

  • |(管道符)− 左侧命令的标准输出通过管道传输到右侧命令的标准输入中。

  • &&(与) − 如果右侧命令执行成功,则执行右侧命令。否则,不要在右侧执行该命令。

  • || (或)− 如果左侧的语句执行成功(返回零),则执行右侧的语句。

您也可以将语句括在括号中,以便在子shell中执行它们。

( <command1> && <command2> ) & ( <command3> && <command4> ) &

这两个命令将依次执行。在每个命令中,第二个结果条件是最后一个。

已运行进程的命令链

我们将研究如何使用 Wait() 函数在一个脚本启动后执行第二个脚本。这是对名为 Wait() 的系统调用的包装器。

当不带任何参数运行时,它会等待当前 Shell 的所有后台进程。如果没有指定任何参数,它将挂起 shell,直到所有进程完成。

您可以使用 pidsof 命令获取所有正在运行且名称相似的进程的进程 ID (PID)。假设我们想在后台运行三个 10 秒的休眠命令,然后检查哪些命令执行成功。我们可以输入 -

$ sleep 10 &
[1] 26176

$ sleep 10 &
[2] 26178

$ sleep 10 &
[3] 26179

$ wait $(pidof sleep) && echo Waited for 3 10-second sleeps
[1]     Done          sleep 10
[2]-    Done          sleep 10
[3]+    Done          sleep 10
Waited for 3 10-second sleeps

您可以将多个命令组合成一个来获得相同的结果。例如,您可以使用以下命令序列:ps -ef | grep -v 'string'。

$ wait $(ps -ef | grep <process name> | tr -s ' ' | cut -f 2 -d ' ' ) && echo Waited for 3 10-second sleeps

命令链展示了将多个操作链接在一起的另一种方式。$() 函数告诉我们,括号内代码的输出将用作 wait 函数的参数。在我们的例子中,-

  • ps −ef - 收集所有进程的详细信息

  • grep <进程名称> - 从 ps −ef 输出中选择包含 <进程名称> 的行

  • tr −s ' ' - 从 grep 输出中删除任何重复的 ' '(空格)

  • cut −d ' ' −f 2 - 通过将空格字符指定为分隔符,从 tr 输出中选择第二列。例如,如果我们使用 ps −ef | grep java 列出系统上运行的所有进程,然后仅筛选出父进程 PID 与上一步匹配的进程。

wait 命令的局限性

对于 WAITTEST_TIMEOUT 变量,WAITTIME 返回自程序开始等待指定命令以来的时间。但是,如果我们依赖已完成命令的 PID,则它并不可靠,例如,它无法返回其实际结果。如果应用程序返回的错误代码大于 128,则无法判断应用程序是由于信号终止还是自身终止。

最后,"sleep"的一个局限性是它只能对在同一 shell 上启动的进程进行休眠。如果我们需要运行其他用户的进程或在其他 shell 中打开,则必须使用其他不太直接的方法,例如 pidof 循环。

while ( pidof -q <command_to_wait> ); do sleep 1; done && <command_to_execute_after>

Wait 是一种比 sleep 更通用但功能稍弱的替代方案。它依赖于特定的休眠时间,并且无法评估目标操作的结果。在 Shell 脚本的迭代之间使用 sleep 非常重要,因为它可以将 CPU 时间返还给系统,尤其是在脚本结束得太快的情况下。

结论

我们已经了解了 Shell 脚本中命令更改的一些常见用法——内联更改和等待另一个脚本完成后再继续执行。此外,还有更多选项和更大的灵活性。您可以使用这些技巧来创建脚本、函数、条件或循环。


相关文章


有用资源