环境:最近的Ubuntu,非标准软件包都可以,只要它们不是太奇特。
我有一个处理stdin
的数据的数据处理器bash脚本:
$ cat data | process_stdin.sh
我可以改变剧本。
我有一个遗留数据生成器系统(我无法更改),它通过SSH登录到计算机并调用脚本,管理数据。伪代码:
foo@producer $ cat data | ssh foo@processor ./process_stdin.sh
遗留系统每天发布./process_stdin.sh
次。
我想让./process_stdin.sh
无限期地在processor
机器上运行,以摆脱进程启动开销。传统的生产者会调用某种包装器,它会以某种方式将数据传递给实际的处理器进程。
是否有一种强大的unix-way方式以最少的代码执行我想要的操作?我不想改变./process_stdin.sh
(多) - 完全重写已经安排好了,但是,唉,还不够快 - 我不能改变数据生产者。
答案 0 :(得分:4)
A(不是那样)肮脏的黑客攻击可能如下:
foo
上的processor
,创建一个fifo并运行tail -f
重定向到process_stdin.sh
的 stdin ,可能是无限循环:
foo@processor:~$ mkfifo process_fifo
foo@processor:~$ while true; do tail -f process_fifo | process_stdin.sh; done
别担心,此时process_stdin.sh
只是等待一些东西到达fifo process_fifo
。无限循环就在这里以防万一发生错误,以便重新启动。
然后你可以发送你的数据:
foo@producer:~$ cat data | ssh foo@processor "cat > process_fifo"
希望这会给你一些想法!
答案 1 :(得分:1)
Flock完成这项工作。
同一命令很快就要求了3次,但等到锁定空闲时才会这样。
# flock /var/run/mylock -c 'sleep 5 && date' &
[1] 21623
# flock /var/run/mylock -c 'sleep 5 && date' &
[2] 21626
# flock /var/run/mylock -c 'sleep 5 && date' &
[3] 21627
# Fri Jan 6 12:09:14 UTC 2017
Fri Jan 6 12:09:19 UTC 2017
Fri Jan 6 12:09:24 UTC 2017