3

环境:最近的Ubuntu,非标准的包只要不是太奇葩都可以。

我有一个数据处理器 bash 脚本,用于处理来自stdin

$ cat data | process_stdin.sh

我可以更改脚本。

我有一个旧的数据生成器系统(我无法更改),它通过 SSH 登录到机器并调用脚本,通过管道传输数据。伪代码:

foo@producer $ cat data | ssh foo@processor ./process_stdin.sh

遗留系统./process_stdin.sh每天启动无数次。

我想./process_stdin.sh在机器上无限期地运行processor,以摆脱进程启动开销。Legacy producer 将调用某种包装器,以某种方式将数据传送到实际的处理器进程。

有没有一种健壮的unix方式可以用最少的代码做我想做的事?我不想改变./process_stdin.sh(太多)——完全重写已经安排好了,但是,唉,还不够快——我不能改变数据生产者。

4

2 回答 2

4

一个(不是那么)肮脏的黑客可能是以下内容:

fooon一样processor,创建一个 fifo 并运行tail -f重定向到 的stdinprocess_stdin.sh可能在无限循环中:

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"

希望这会给你一些想法!

于 2013-07-07T16:34:16.320 回答
1

做这项工作。

同一命令很快询问了 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
于 2017-01-06T12:18:19.160 回答