有一种简单而强大的方法可以在Bash中创建“单例”进程吗?

时间:2013-07-07 16:08:01

标签: bash

环境:最近的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(多) - 完全重写已经安排好了,但是,唉,还不够快 - 我不能改变数据生产者。

2 个答案:

答案 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
相关问题