我有包含多个命令的脚本。如何将命令分组在一起运行(我想制作几组命令。在每个组内,命令应该并行运行(同时)。这些组应该顺序运行,等待一组完成后再开始下一组)...即
#!/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
bash shell 不是已经将命令一一运行,等待执行的命令完成吗?那么我们wait什么时候以及为什么需要这个命令呢?
我知道这个问题已经被问过并回答过,但我找到的解决方案会侦听空间并输入:
while [ "$key" != '' ]; do
read -n1 -s -r key
done
Run Code Online (Sandbox Code Playgroud)
有没有办法(在bash 中)制作一个只等待空格键的脚本?
如果我有以下 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死?
在此脚本中,将拉取所有 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。
为什么会这样?我该如何解决?
我有以下脚本:
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...这个想法是用两个变量a和b(来自变量)启动包装的命令wk。这应该与 5 个进程并行完成。接下来的 5 个作业应等待前 5 个进程完成。我当前的代码打印出来Check,但它根本不等待。但是,如果我更改wait为sleep 10s,它就会休眠。
我如何wait在这里工作?
我找不到任何文件可以充分解释我的观察结果。运行以下代码后,我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) 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) #!/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 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需要选择?
我目前正在阅读 M. Bach 的《UNIX\xc2\xae 操作系统的设计》。
\n我读到了有关主 shell 循环的内容。\n看看if (/* piping */)块。如果我理解正确的话,管道允许将第一个命令输出视为第二个命令输入。如果是这样,为什么没有代码让第二个命令等待第一个命令终止?如果没有这个命令,管道似乎毫无意义:第二个命令可以在其输入尚未准备好的情况下开始执行。
我正在编写一个脚本,它在后台同时执行一堆命令,然后等待它们全部完成:
#!/bin/sh -fx
./p1 &
./p2 &
./p3 &
./p4 &
./p5 &
wait
Run Code Online (Sandbox Code Playgroud)
问题是,如果这些过程中的一个或多个失败,它就会继续下去。如何同时执行所有这些命令并检查一个或多个命令是否失败?