我需要运行2个Linux命令,每个命令都不会退出并继续输出到stdout(直到我Ctrl-C
)。
我可以在2个独立的终端中运行2个命令,没有任何问题。
但是,我可以在一个终端中发出一个命令来运行前面的两个命令并让它们共享stdout吗?
答案 0 :(得分:4)
您可以使用 GNU Parallel 来表达和控制它。让我们假设您创建了2个虚拟进程f1
和f2
,它们只是重复输出而且永远不会停止。他们可能看起来像这样:
<强> F1 强>
#!/bin/bash
while :; do
echo 1,$RANDOM
sleep 2
done
<强> F2 强>
#!/bin/bash
while :; do
echo 2,$RANDOM
sleep 2
done
现在你可以同时开始(显然 - 它没有被称为 GNU Parallel 没有理由),如下所示:
parallel --line-buffer ::: ./f1 ./f2
1,17387
2,1457
2,32743
1,15684
...
...
或者,如果您希望使用流程名称标记输出行,则可以执行以下操作:
parallel --line-buffer --tag ::: ./f[12]
./f1 1,11877
./f2 2,28716
./f2 2,7683
./f1 1,23392
...
...
如果你控制了这个过程,它们都会停止 - 尽管你可以改变它 - 如果你愿意的话 - 在联机帮助页上搜索--halt
。
答案 1 :(得分:2)
你可以在背景上运行第一个,在前景上运行第二个,它们将共享标准输出。使用Ctrl-C
,您将能够停止第二个,然后如果您想要停止第一个,您将不得不杀死该工作。按fg
,然后按Ctrl-C
cmd1 & cmd2
如果您想要混合输出文件,那么
cmd1>file & cmd2>file
如果您使用;
而不是&
,那么第2个命令将在第1个命令完成后开始,如果您想要更可读的输出。
不确定是否可以在同一个终端上同时运行并将它们停在一起。可能使用脚本或类似的东西。
答案 2 :(得分:0)
使用花括号:
{ command1; command2; } > output
如果要重定向stdout和stderr:
{ command1; command2; } &> output