bash - 并行输出到控制台

标签 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

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

最佳答案

一般来说,确保写入不重叠的唯一方法是使用某种互斥体。在 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 &

关于bash - 并行输出到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35136588/

相关文章:

python - 在 linux 中删除行

bash - 寻找大文件的 uniq -c 替代品

用于公钥身份验证的 bash/ssh 测试

bash - 如何为多个项目创建多个 Neo4j 数据库?

html - 我如何从 cgi-bin 提供 HTML?

linux - 在 Linux 中替换大文本字符串

linux - 在每行中查找文件中具有特定偏移量的所有单词(bash)

mysql - 用于从 s3 获取文件的 Bash 脚本

linux - mosquitto-client 获取拒绝连接

bash - 如果存在匹配,则将文本附加到下一行的开头