2013-07-07 51 views
3

環境:最近的Ubuntu,非標準的軟件包都可以,只要它們不太特殊。有沒有一種簡單而強大的方法來在Bash中創建一個「單例」進程?

我有一個數據處理器bash腳本,從stdin處理數據:

$ cat data | process_stdin.sh 

我可以改變腳本。

我有一個遺留數據生產者系統(我無法更改)通過SSH登錄到計算機並調用腳本,管理它的數據。僞代碼:

[email protected] $ cat data | ssh [email protected] ./process_stdin.sh 

遺留系統啓動./process_stdin.sh每天無數次。

我想保持./process_stdin.shprocessor機器上無限期地運行,以擺脫進程啓動開銷。傳統生產者會調用某種包裝器,以某種方式將數據傳送到實際的處理器進程。

是否有一個強大的unix方式來做我想用最少的代碼?我不想更改./process_stdin.sh(很多) - 完全重寫已經安排好了,但是,唉,還不夠快 - 而且我不能更改數據生產者。

+0

我首先想到的是,您可能會遇到更困難的時間,以確保您的腳本每次循環輸入一個「乾淨」環境。您試圖避免的流程啓動會執行很多操作,並且可能會將腳本編寫爲假設啓動。我並不是說在你的情況下開銷可能會過大,但是我可以通過查看一個方法來包裝它並將數據傳入管道。 – bitfiddler

+0

不確定是否有這種可能性,如果可以使腳本塊在管道輸入上運行,然後運行在一個無限循環中,然後發送它的好消息,並且您需要將文件發送到與腳本關聯的管道中,每次獲取數據,初始化應用程序並運行腳本主體。退出時,您可能會發送一個關鍵字以便離開主循環。 – aah134

+0

unix方式正在編寫一個* init腳本*,並可能將其添加到某個運行級別。 BTW [UUOC](http://partmaps.org/era/unix/award.html)。 –

回答

4

A(不那麼)骯髒的黑客可以是以下各項:

作爲fooprocessor,創建一個FIFO和運行tail -f重定向到標準輸入process_stdin.sh,可能在一個無限循環:

[email protected]:~$ mkfifo process_fifo 
[email protected]:~$ while true; do tail -f process_fifo | process_stdin.sh; done 

別擔心,此時process_stdin.sh正在等待一些東西到達fifo process_fifo。無限循環就在這裏,以防發生錯誤,從而重新啓動。

然後你就可以這樣把你的數據:

[email protected]:~$ cat data | ssh [email protected] "cat > process_fifo" 

希望這會給你一些想法!

+1

這將序列化所有處理。原來的確至少允許並行... –

+1

這很好,可以通過重複這些指令乘以CPU的數量(當然有單獨的路徑)來實現並行性。這樣一來,它就不那麼混亂,順便說一句,應該更有效率。 –

+2

小心這個解決方案!如果你真的寫入fifo「每天有數萬次」,你可能偶爾會發現你的寫入交錯。 (即使低級別write(2)調用是原子級的,緩衝標準庫版本也不是,並且不能保證'ssh'將傳輸一個塊中的數據。) – rici

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 
相關問題