2016-08-22 40 views
0

我有(bash)的列表編輯命令列表我要運行:要運行命令的列表,但能夠同時它的運行

<Command 1> 
<Command 2> 
... 
<Command n> 

每個命令需要很長的時間來運行,並且有時在看到(例如)<Command 1>的輸出後,我想要更新參數<Command 5>,或者在列表中的任意位置添加新的<Command k>。但我希望能夠隨時離開我的機器,並通過我上次更新到列表繼續工作。

這與此處的問題類似:Edit shell script while it's running。其中一些答案可以提供服務,但是這個問題還有一些額外的限制,希望編輯腳本文件本身,我懷疑有一個更簡單的答案,因爲我沒有那個確切的約束。

我目前的解決方案是通過調用第二個腳本來結束我的腳本。我可以在第一個文件運行時編輯第二個文件,這樣我可以將新命令添加到列表的末尾,但不能對第一個文件中的命令列表進行任何更改。一旦執行在第二個文件中開始,我無法做出任何更改。但我經常停止腳本插入更新,這有時意味着要停止一個幾乎完成的長命令,只有在我離開我的機器一段時間之前,我才能更新列表中的後續項目。我當然可以用這種方式將許多文件鏈接起來,但對於(希望)有一個簡單的解決方案來說,這似乎是一團糟。

+0

所以你想使用分支而不實際使用分支?我建議你在腳本中添加更多邏輯,以便處理所有需要的情況。它看起來像你有一個XY問題。 – fanton

回答

0

我會說把要在文件中,並在主文件列表中的所有命令文件

前的運行每個命令:main.sh

#!/bin/bash 

# Here you define the absolute path of your script 

scriptPath="/home/script/" 

# Name of your script 

scriptCommand1="command_1.sh" 
scriptCommand2="command_2.sh" 
... 
scriptCommandN="command_N.sh" 

# Here you execute your script 

$scriptPath/$scriptCommand1 
$scriptPath/$scriptCommand2 
... 
$scriptPath/$scriptCommandN 

我猜想當1正在運行時,您可以修改另一個,因爲它們是外部文件

2

這比我提供完整代碼的概念答案更具概念性。我的想法是運行Redis(Redis description here) - 安裝非常簡單 - 並將其用作數據結構服務器。在您的情況下,數據結構將爲作業列表。)

因此,您基本上添加每個工作給Redis的列表,你可以在命令行中使用LPUSH做:

echo "lpush jobs job1" | redis-cli 

然後就可以開始一個或更多的工人,在並行,如果你想和他們坐在一環,做重複BLPOP作業(阻止流行音樂,等待有作業)從列表中刪除並處理它們:

#!/bin/bash 
while :; do 
    job=$(echo brpop jobs 0 | redis_cli) 
    do $job 
done 

然後,您可以隨意修改列表,而工作人員正在使用刪除和插入操作。

示例here

+0

我喜歡這個想法。它可以適用於任何隊列系統,包括一個簡單的本地隊列系統,它將隊列保存在一組編號文件中。 – tripleee

相關問題