标签: wait

并行运行命令并等待一组命令完成后再开始下一组命令

我有包含多个命令的脚本。如何将命令分组在一起运行(我想制作几组命令。在每个组内,命令应该并行运行(同时)。这些组应该顺序运行,等待一组完成后再开始下一组)...即

#!/bin/bash
command #1
command #2
command #3
command #4
command #5
command #6
command #7
command #8
command #9
command #10
Run Code Online (Sandbox Code Playgroud)

我怎样才能每 3 个命令运行一次?我试过:

#!/bin/bash
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10
Run Code Online (Sandbox Code Playgroud)

但这不能正常工作(我想同时并行运行多组命令。另外,我需要等待第一组完成后再运行下一组)

脚本退出并显示错误消息!

shell shell-script process-management background-process wait

19
推荐指数
2
解决办法
5万
查看次数

我们何时以及为什么需要在 bash 上使用 `wait` 命令?

bash shell 不是已经将命令一一运行,等待执行的命令完成吗?那么我们wait什么时候以及为什么需要这个命令呢?

bash wait

17
推荐指数
1
解决办法
2276
查看次数

按空格键继续(不是 ENTER)

我知道这个问题已经被问过并回答过,但我找到的解决方案会侦听空间并输入

while [ "$key" != '' ]; do
        read -n1 -s -r key
done
Run Code Online (Sandbox Code Playgroud)

有没有办法(在bash 中)制作一个等待空格键的脚本?

bash shell-script read wait

9
推荐指数
1
解决办法
1289
查看次数

睡眠、等待和 Ctrl+C 传播

如果我有以下 shell 脚本

sleep 30s
Run Code Online (Sandbox Code Playgroud)

Ctrl+C在 shell 脚本运行时命中sleep,它随之消失。

如果我有以下 shell 脚本

sleep 30s &
wait
Run Code Online (Sandbox Code Playgroud)

Ctrl+C在 shell 脚本运行时命中,sleep继续,现在父级为 1。

这是为什么?bash 不会传播Ctrl+C给所有孩子吗?

编辑:如果我有以下脚本

/usr/bin/Xvfb :18.0 -ac -screen 0 1180x980x24 &
wait
Run Code Online (Sandbox Code Playgroud)

我在那里生成一个程序,这次Ctrl+C在主Xvfb进程上也会杀死该进程。

那么如何/为什么Xvfb与睡眠不同?

在某些进程的情况下,我看到它们被 收割init,在某些情况下它们会死亡。为什么睡眠会被 init 收获?为什么会Xvfb死?

bash sleep wait

8
推荐指数
2
解决办法
4662
查看次数

为什么在这个脚本中等待所有子shell之后都没有执行?

在此脚本中,将拉取所有 git 存储库:

#!/bin/bash

find / -type d -name .git 2>/dev/null | 
while read gitFolder; do
    if [[ $gitFolder == *"/Temp/"* ]]; then
        continue;
    fi
    if [[ $gitFolder == *"/Trash/"* ]]; then
        continue;
    fi
    if [[ $gitFolder == *"/opt/"* ]]; then
        continue;
    fi
    parent=$(dirname $gitFolder);
    echo "";
    echo $parent;
    (git -C $parent pull && echo "Got $parent") &
done 
wait
echo "Got all"
Run Code Online (Sandbox Code Playgroud)

wait等待所有git pull子 shell。

为什么会这样?我该如何解决?

subshell wait

7
推荐指数
1
解决办法
659
查看次数

如何在 shell 脚本中等待 nohup 作业完成?

我有以下脚本:

echo "$wk" | while read -r a b;
do
    counter=$(($counter+1))
    nohup sh -c 'impala-shell -d nielsen -f query.sql --var=dt=$a --var=incre=$b;
    echo $a,$?>>$week_status_file;
    if [ $? -ne 0 ]; then
        echo $a,$b>>$err_week_file
    fi'
    if [ $(($counter%5)) == 0 -a $counter -ge 5 ];
    then
        echo "Check"
        wait
    fi
done
Run Code Online (Sandbox Code Playgroud)

impala-shell...这个想法是用两个变量ab(来自变量)启动包装的命令wk。这应该与 5 个进程并行完成。接下来的 5 个作业应等待前 5 个进程完成。我当前的代码打印出来Check,但它根本不等待。但是,如果我更改waitsleep 10s,它就会休眠。

我如何wait在这里工作?

bash shell-script nohup wait

5
推荐指数
1
解决办法
8728
查看次数

为什么 wait $pid 命令会被等待进程的任何信号中断?

我找不到任何文件可以充分解释我的观察结果。运行以下代码后,我kill -SIGINT $my_pid从不同的 shell 执行 a。我会正确地看到#### received trap 2前两次。然而,该wait命令在每次信号时都会被中断。为什么?

#!/bin/bash

for s in {0..64}
do
    trap "echo '#### received trap $s'" $s
done

./code &
pid=$!
my_pid=$$

wait $pid
wait $pid
Run Code Online (Sandbox Code Playgroud)

bash kill wait

5
推荐指数
1
解决办法
985
查看次数

SIGCHLD 和 waitpid() 或 wait() 之间有什么关系?

waitpid()如果我是正确的,进程会通过调用或函数来等待其子进程终止或停止wait()

waitpid()SIGCHLD信号和or函数有什么关系wait()

  • waitpid()当进程调用或wait()函数时,进程会自行挂起直到子进程终止/停止(这与向其发送 SIGCHLD 信号之前相同)是否正确?

    pause()挂起当前进程,直到有任何信号发送给它。所以我想知道是否waitpid()类似,除了直到 SIGCHLD 发送给它?)

  • 当 SIGCHLD 被发送到已通过调用挂起的进程时waitpid(),执行 SIGCHLD 处理程序和从挂起中恢复之间的顺序是什么waitpid()
    (在以下计算机系统示例中:程序员的视角,SIGCHLD 处理程序调用waitpid()。)

谢谢。

void handler(int sig)
{
  int olderrno = errno;

  while (waitpid(-1, NULL, 0) > 0) {
    Sio_puts("Handler reaped child\n");
  }
  if (errno != ECHILD)
    Sio_error("waitpid error");
  Sleep(1);
  errno = olderrno;
}

int main()
{
  int i, n;
  char buf[MAXBUF];

  if (signal(SIGCHLD, handler1) == SIG_ERR)
    unix_error("signal error"); …
Run Code Online (Sandbox Code Playgroud)

linux signals system-calls api wait

5
推荐指数
2
解决办法
9845
查看次数

是什么决定了脚本的后台进程是否获得终端的 SIGINT 信号?

#!/usr/bin/env bash

sleep 3 && echo '123' &
sleep 3 && echo '456' &
sleep 3 && echo '999' &
Run Code Online (Sandbox Code Playgroud)

如果我运行它,并SIGINT通过终端按 control-c 发送,它似乎仍然回显123...输出。我认为这是因为它以某种方式分离?

wait < <(jobs -p)但是,如果我在脚本末尾添加(等待所有后台作业完成),然后运行它并发送,SIGINT不会123...显示输出。

如何解释这种行为?是否以wait某种方式拦截信号并将其传递给后台进程?或者它与进程是否“连接”到终端的某种状态有关?

我发现了一个可能与此相关的问题,但我无法弄清楚它与上述行为有何关系:为什么在使用 wait() 函数时不忽略 SIGCHLD 信号?

bash terminal signals wait

4
推荐指数
1
解决办法
1689
查看次数

`-f' 选项对 `wait' 与默认行为有何作用?

Bash 5.0 包括一个新-f选项wait[1]

j. The `wait' builtin now has a `-f' option, which signfies to wait until the
   specified job or process terminates, instead of waiting until it changes
   state.
Run Code Online (Sandbox Code Playgroud)

这是什么wait -f $pid做的,而不是默认wait $pid?在什么条件下-f需要选择?

bash wait

3
推荐指数
1
解决办法
551
查看次数

关于流程生命周期的问题

我已经设法对流程生命周期中的系统调用wait(2)_exit(2)系统调用进行了质疑。

我关于wait(2)系统调用的问题是......父进程是否将它发布给内核?还是内核将其发布给父进程?并且是_exit(2)从子进程到父进程的 [ ] 系统调用问题吗?还是子进程_exit(2)向内核发出 [ ] ?

我尝试谷歌搜索并观看 youtube 视频以获得答案......但我从未看到任何特定于此的东西。

process system-calls exit wait

2
推荐指数
1
解决办法
166
查看次数

为什么第二个命令不等待第一个命令(管道)的输出?

我目前正在阅读 M. Bach 的《UNIX\xc2\xae 操作系统的设计》。

\n

我读到了有关主 shell 循环的内容。\n看看if (/* piping */)块。如果我理解正确的话,管道允许将第一个命令输出视为第二个命令输入。如果是这样,为什么没有代码让第二个命令等待第一个命令终止?如果没有这个命令,管道似乎毫无意义:第二个命令可以在其输入尚未准备好的情况下开始执行。

\n

主壳循环

\n

shell pipe wait

2
推荐指数
1
解决办法
890
查看次数

使用 wait (bash posix) 如果脚本中的一个进程失败则失败

我正在编写一个脚本,它在后台同时执行一堆命令,然后等待它们全部完成:

#!/bin/sh -fx
./p1 &
./p2 &
./p3 &
./p4 &
./p5 &
wait
Run Code Online (Sandbox Code Playgroud)

问题是,如果这些过程中的一个或多个失败,它就会继续下去。如何同时执行所有这些命令并检查一个或多个命令是否失败?

bash shell-script posix wait

2
推荐指数
1
解决办法
668
查看次数