cze*_*rny 22 bash job-control jobs
我正在寻找诸如command1 ; command2如何运行之类的东西command2,command1但我想计划command2何时command1已运行的执行。
它可以通过输入command2并通过 Enter 确认来解决,假设command1不消耗标准输入,command1并且不会在输出上产生太多文本,使得输入不切实际(输入的字符与command1输出混合)。
The*_*Hat 30
通常我做的是:Ctrl+Z fg && command2
bg,在您输入 command2 时在后台恢复 command1。fg && command2如果 command1 成功,则在前台恢复 command1 并在之后将 command2 排队。当然你也可以替代品;或||为&&,如果你愿意的话。cze*_*rny 22
启动命令
command1
Run Code Online (Sandbox Code Playgroud)按Ctrl+暂停执行Z
通过执行找到暂停命令的作业号(通常已经打印到控制台何时控制台命令暂停)
jobs
Run Code Online (Sandbox Code Playgroud)让我们command1在后台继续
bg
Run Code Online (Sandbox Code Playgroud)计划执行command2等待完成command1
wait -n <command1 job number> ; command2
Run Code Online (Sandbox Code Playgroud)文档作业控制内置
有几种选择。
使用一个&符号,“推送到后台”,第二个程序在第一个程序启动后启动,但它们可能会并排运行。
command1 & command2
Run Code Online (Sandbox Code Playgroud)使用两个&符号,“逻辑和”,只有在第一个程序成功完成后,第二个程序才会启动。
command1 && command2
Run Code Online (Sandbox Code Playgroud)在命令行中用分号分隔命令,第二个程序将在第一个程序完成时启动,即使它失败或被中断。
command1 ; command2
Run Code Online (Sandbox Code Playgroud)如果wait <PID>第一个命令已经在同一个 shell 中运行(在同一个终端窗口中),您可以使用它来等待第一个命令完成。
否则,如果第一个命令已经从另一个 shell(在另一个窗口中)运行,您可以使用一个小的while 循环使用 ps 检查 PID 是否仍然被ps. 当它不再被找到时,将启动第二个命令。
此演示示例用于bash检查是否top通过 PID 运行,并运行命令
echo "*** $USER, I am ready now ***"
Run Code Online (Sandbox Code Playgroud)
如果/何时top不再运行。
pid=$(ps -A|grep top|cut -d ' ' -f 1); \
while [ "$pid" != "" ]; do ps -A|grep "$pid" > /dev/null; \
if [ $? -eq 0 ]; then sleep 5;else pid=""; fi; done; \
echo "*** $USER, I am ready now ***"
Run Code Online (Sandbox Code Playgroud)