2015-09-23 62 views
0

我正在運行一個shell腳本,類似於bash中的sh script.sh。該腳本包含很多行,其中一些需要幾秒鐘的時間,另外一些則需要幾天才能執行。我怎樣才能殺死sh命令,但不殺死當前正在運行的命令(腳本中的當前行)?如何在不殺死當前執行的行的情況下殺死shell腳本

+1

我相信你不能。然而,你可能巧妙地編寫了你的​​腳本...... –

回答

1

我假設你有你的腳本運行天,然後你不只是要殺死它不知道,如果它的一個子完成。

使用ps找到進程的pid。

然後

child=$(pgrep -P $pid) 
while kill -s 0 $child 
do 
    sleep 1 
done 
kill $pid 
+0

是的 - 這正是我所需要的。非常感謝! –

+0

這裏有一個巨大的機會窗口,讓父進程在測試任何孩子和殺死父母之間產生另一個子進程。 –

+0

是的,並且當新的孩子被創建時,while循環存在並且父母被殺死,這被理解爲意圖 –

2

你還沒有詳細說明當你'殺了'你的腳本時會發生什麼,但是我假設你希望當前正在執行的行完成,然後在做任何更多的工作之前退出。

這可能是最好的實現,只有通過編寫你的腳本的行爲方式來接收這樣的kill命令並以適當的方式進行響應 - 我不認爲在linux中這樣做有什麼魔力。

例如:

  • 您可以捕獲信號,然後設置一個變量
  • 檢查文件的存在(如touch /var/tmp/trigger

然後在腳本中每行之後,您需要檢查每個陷阱是否已被調用(或您的觸發器文件已創建) - 然後退出。如果沒有設置觸發器,則繼續進行下一項工作。

就我所知,您無法捕獲SIGKILL(-9) - 如果有人將其發送給您的流程,那麼它將會死亡。

HTH,王牌

2

我能想到實現這一目標的唯一方法是捕獲父進程的終止信號,設置一個標誌,然後在你的腳本執行另一個命令之前反覆檢查此標誌。

但子進程也需要對kill信號免疫。然而bash似乎以這種方式表現出不同於ksh的效果,並且下面似乎工作正常。

#!/bin/bash 

QUIT=0 

trap "QUIT=1;echo 'term'" TERM 

function terminated { 
    if ((QUIT==1)) 
    then 
    echo "Terminated" 
    exit 
    fi 
} 

function subprocess { 
    typeset -i N 
    while ((N++<3)) 
    do 
    echo $N 
    sleep 1 
    done 
} 

while true 
do 
    subprocess 
    terminated 
    sleep 3 
done