如何在已经运行的现有命令完成后运行命令?

mli*_*ner 44 linux terminal bash

如果我启动一个需要很长时间的脚本,我不可避免地会在启动脚本后意识到这一点,并希望我有办法在它完成后做某种警报。

因此,例如,如果我运行:

really_long_script.sh
Run Code Online (Sandbox Code Playgroud)

然后按回车...完成后如何运行另一个命令?

ala*_*and 56

您可以用 分隔多个命令;,以便它们按顺序执行,例如:

really_long_script.sh ; echo Finished
Run Code Online (Sandbox Code Playgroud)

如果您希望仅在脚本以返回码 0 结束时才执行下一个程序(这通常意味着它已正确执行),则:

really_long_script.sh && echo OK
Run Code Online (Sandbox Code Playgroud)

如果您想要相反的(即仅在当前命令失败时继续),则:

really_long_script.sh || echo FAILED
Run Code Online (Sandbox Code Playgroud)

您可以在后台运行您的脚本(但请注意,脚本输出 (stdoutstderr) 将继续进入您的终端,除非您将其重定向到某个地方),然后wait为它:

really_long_script.sh &
dosomethingelse
wait; echo Finished
Run Code Online (Sandbox Code Playgroud)

如果您已经运行了脚本,您可以使用 挂起它Ctrl-Z,然后执行如下操作:

fg ; echo Finished
Run Code Online (Sandbox Code Playgroud)

在哪里fg将挂起的进程带到前台(bg将使其在后台运行,很像开始时&

  • 由于 `fg` 返回它恢复的作业的值,如果你想在执行另一个命令之前确保命令成功,你可以使用 `fg && echo Finished`。 (9认同)
  • @FabianRöling Ctrl-Z 暂停进程(通过发送 SIGHUP),然后 `bg` 或 `fg` 稍后恢复它(不会再次启动它)。您可以尝试从终端启动一些 GUI 应用程序,然后在终端中按 Ctrl-Z(应用程序将冻结),然后执行“fg”(应用程序将再次响应)。尽管多年来在各种程序中广泛使用 Ctrl-Z,但我从未遇到过任何问题。它弄乱了一些奇特的屏幕输出(例如进度条),但这是可以预料的,因为您暂时控制了终端。 (2认同)
  • @FabianRöling 是的,它说“已停止”。但是您可以在同一控制台中调用“jobs”来查看该进程仍然存在(尽管实际上处于暂停/停止状态)。您还可以调用`ps a`并查看该进程仍然存在。它已停止,但未终止,并且可以恢复(通过“fg”或“bg”)。如果您尝试通过输入“exit”(而不是关闭终端窗口)来关闭控制台,它会抱怨进程已停止。 (2认同)

Mar*_* An 22

如果该进程未在当前 tty 上运行,请尝试以下操作:

watch -g ps -opid -p <pid>; mycommand
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢“手表”的创造性使用。超级简短的回答和一个学习使用手表的新方法 (4认同)

Jaa*_*ing 16

您还可以使用 bash 的作业控制。如果你开始

$ really_long_script.sh
Run Code Online (Sandbox Code Playgroud)

然后按 ctrl+z 暂停它:

^Z
[1]+  Stopped                 really_long_script.sh
$ bg
Run Code Online (Sandbox Code Playgroud)

在后台重新启动作业(就像用 启动它一样really_long_script.sh &)。然后你可以等待这个后台工作

$ wait N && echo "Successfully completed"
Run Code Online (Sandbox Code Playgroud)

其中 N 是作业 ID(如果您没有运行任何其他后台作业,则可能为 1),也如上[1]所示。