我有几个测试脚本,每个脚本都运行一个测试 PHP 应用程序。每个脚本永远运行。
所以, cat.sh
, dog.sh
, 和foo.sh
每个都运行一个 PHP 脚本。每个 shell 脚本都在循环中运行 PHP 应用程序,因此它会永远运行,每次运行后都会休眠。
我试图弄清楚如何同时并行运行脚本。在 stdout/term 窗口中查看 PHP 应用程序的输出。
我想,做类似以下的事情可能会奏效:
foo.sh > &2
dog.sh > &2
cat.sh > &2
Run Code Online (Sandbox Code Playgroud)
在 shell 脚本中它就足够了,但它不起作用。
foo.sh, runs foo.php once, and it runs correctly
dog.sh, runs dog.php in a never ending loop. it runs as expected
cat.sh, runs cat.php in a never ending loop
*** this never runs!!!
Run Code Online (Sandbox Code Playgroud)
看来 shell 脚本永远不会运行cat.sh
。如果我cat.sh
在单独的窗口/术语中单独运行,它会按预期运行。
有没有人对如何让这些脚本并行运行有任何想法?
Chr*_*ell 11
您当前的设置正在按顺序运行您的命令。第一个运行并完成,允许第二个启动。第二个永远不会结束,所以第三个永远没有机会开始。
尝试这个:
foo.sh >foo.out 2>foo.err &
dog.sh >dog.out 2>dog.err &
cat.sh >cat.out 2>cat.err &
Run Code Online (Sandbox Code Playgroud)
这将告诉每个命令在后台运行,并将它们的输出和错误信息发送到文件。当一个命令在后台运行时,它会与当前会话分离,并允许运行下一个命令。将与号 ( &
) 作为行的最后一个字符很重要。否则,它可能无法正确识别。
或者,让您的每个 shell 脚本运行.php
您显然使用与上述相同的语义调用的关联脚本。在这种情况下,您foo.sh
可能包含:
#!/bin/bash
php foo.php >foo.out 2>foo.err &
Run Code Online (Sandbox Code Playgroud)
最后,如果您需要真正的并行操作,请查看GNU Parallel。
注意:如果你真的希望输出到屏幕/终端,你可以不使用输出重定向:
foo.sh &
Run Code Online (Sandbox Code Playgroud)
但是请记住,同时运行多个命令会导致输出混乱(您现在可能知道哪个输出或错误来自哪个命令),并且如果您注销,输出将无处可去。
小智 7
这可以通过并行命令来完成。
美丽的例子:平行
[me@neo]<bash><~> 19
05:51 Tue Mar 05 > man -f parallel
parallel (1) - run programs in parallel
Run Code Online (Sandbox Code Playgroud)
——
parallel -j 3 -- "sh foo.sh" "sh dog.sh" "sh cat.sh"
Run Code Online (Sandbox Code Playgroud)
这将同时并行启动 3 个脚本。
parallel sh -c "echo hi; sleep 2; echo bye" -- 1 2 3
Run Code Online (Sandbox Code Playgroud)
默认情况下,这将根据同一命令的多个进程启动,具体取决于 CPU 计数。
parallel -j 3 sh -c "echo hi; sleep 2; echo bye" -- 1 2 3
Run Code Online (Sandbox Code Playgroud)
这将强制同时执行 3 个进程,即使您只有 2 个 cpu。
例子:
[me@neo]<bash><~> 31
06:09 Tue Mar 05 > parallel -j 10 sh -c "echo Hello World; sleep 3; echo Good morning" -- $(seq 1 10)
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Good morning
Good morning
Good morning
Good morning
Good morning
Good morning
Good morning
Good morning
Good morning
Good morning
Run Code Online (Sandbox Code Playgroud)