2012-10-22 73 views
0

我試圖找到或實現一個簡單的解決方案,它可以按順序排列Linux shell命令,以便一次執行一個。這裏是標準:用於linux命令行的順序FIFO隊列

  1. 隊列必須一次執行一個命令,即沒有兩個命令可以同時運行。
  2. 我沒有提前列出命令。他們將從Web服務器收到的Web請求中進入。這意味着隊列可能很長一段時間是空的,同時可以有10個請求進入。
  3. 我的web服務器只能對shell進行系統調用,所以這個程序/解決方案需要從命令行調用。
  4. 我只有一臺機器,所以它不能也不需要將工作排除到多臺機器上。

最初我以爲at命令可以做我想做的,但唯一的是它不會按順序執行命令。

我想實現在Python與這些零件自己的解決方案中:

  1. 有一個鎖定文件的專用目錄
  2. 排隊命令被存儲爲文件名的單個文件包含一個遞增序列ID或時間戳或類似的東西,我將其稱爲「命令文件」
  3. 在鎖定文件上使用fcntl模塊編寫python腳本,以確保只有1個腳本實例正在運行
  4. 腳本將監視任何文件的目錄並按照文件名的順序在文件中執行shell命令
  5. 當目錄中沒有更多的「命令文件」時,腳本將解鎖鎖定文件並退出
  6. 當我的web服務器想要爲了排隊工作,它會添加一個新的「命令文件」並調用我的python腳本
  7. python腳本將檢查自身的另一個實例是否正在運行。如果是,則退出,這將讓另一個實例處理新排隊的「命令文件」。如果不是,那麼鎖定鎖文件並按順序開始執行「命令文件」

這聽起來像是會起作用嗎?我不知道如何處理的唯一競爭條件是當腳本的第一個實例檢查目錄並且看到它是空的,並且在它解鎖鎖定文件之前,一個新的命令排隊並且腳本的新實例被調用。當新腳本看到文件被鎖定時將退出。然後原始腳本將解鎖文件並退出。

那裏有東西已經做了這個,所以我不必自己實現這個嗎?

+0

你真的要讓網絡用戶在你的系統上運行shell命令嗎?第一次有人運行'rm -rf *'時會發生什麼? –

+0

沒有。我基於用戶在表單提交中提供的信息運行我自己的shell命令,從中我將自己的params生成到我的shell腳本中。 – Addison

回答

5

使用命名管道,又名FIFO:

mkfifo /tmp/shellpipe 

啓動shell進程,其輸入來自管道:

/bin/sh < /tmp/shellpipe 

當Web服務器要執行的命令,那麼將其寫入到管道。

sprintf(cmdbuf, "echo '%s' > /tmp/shellpipe", command); 
system(cmdbuf); 
1

一個posix message queue似乎比時間戳文件,這樣亂搞,這和一大堆簡單,速度更快量身定做。腳本可以在請求進入時排隊;另一個腳本將這些請求出列並執行它們。有一些適用於隊列的大小限制,但聽起來你不會接近它們。