并行输出到控制台

时间:2016-02-01 17:24:58

标签: bash

有没有办法让后台进程的输出不会出现在另一个进程的输出中间?

我有一个脚本status_update.sh,它会定期查询单独主机上的某些状态,并在更改时打印更新行。

我想为多个主机并行运行此脚本:

#!/bin/bash

status_update.sh -h host1 &
status_update.sh -h host2 &
status_update.sh -h host3 &
status_update.sh -h host4 &

echo "hit any key to quit"
read -n 1 CHAR

killall status_update.sh

我遇到的问题是来自一个进程的更新显示在另一个进程的输出中间。有没有办法将输出分开在不同的行上?

2 个答案:

答案 0 :(得分:2)

通常,确保写入不重叠的唯一方法是使用某种互斥锁。这在shell中实现很痛苦,可能不应该这样做。而是将status_update.sh写入阻塞互斥锁并将名称作为参数传递,然后让status_update.sh阻止任何写入,直到它获得互斥锁。在不使用互斥锁的情况下可以缓解问题的一种方法是将所有内容传递给cat,这有助于确保进行较少的写入系统调用(如果进行了20次写入大小为5而不是1次写入大小为100,则有更多机会写入是交错的)。也就是说,试试:

#!/bin/bash

status_update.sh -h host1 | cat &
status_update.sh -h host2 | cat &
status_update.sh -h host3 | cat &
status_update.sh -h host4 | cat &

答案 1 :(得分:1)

您可以使用 GNU Parallel 为您提供一个保护echo命令的命名互斥锁:

sem --id MyMutex echo something

这样,一次只能运行一个echo个实例。请参阅here