我有一個Cygwin bash腳本,我需要在特定條件下觀察並終止 - 具體來說,在創建某個文件後。不過,我很難理解如何以與Ctrl + C完全相同的級別終止腳本。如何從bash腳本中終止腳本的Cygwin bash中的進程樹
這是一個簡單的腳本(稱爲test1
),只是等待被終止。
#!/bin/bash
test -f kill_me && rm kill_me
touch kill_me
tail -f kill_me
如果這個腳本在前臺運行,按Ctrl + C將終止兩個tail
和腳本本身。如果腳本在後臺運行,kill %1
(假設它是作業1)也將終止tail
和腳本。
但是,當我嘗試從腳本執行相同的操作時,我發現只有運行腳本的bash
進程終止,而tail
掛起時與其父級斷開連接。這裏有一種方法我試過(test2
):
#!/bin/bash
test -f kill_me && rm kill_me
(
touch kill_me
tail -f kill_me
) &
while true; do
sleep 1
test -f kill_me && {
kill %1
exit
}
done
如果這樣運行,在bash在後臺運行的子shell終止OK,但仍tail
周圍掛起。
如果我使用一個顯式單獨的腳本,這樣,它仍然不起作用(test3
):
#!/bin/bash
test -f kill_me && rm kill_me
# assuming test1 above is included in the same directory
./test1 &
while true; do
sleep 1
test -f kill_me && {
kill %1
exit
}
done
tail
運行此腳本後,仍掛在。
在我的實際案例中,創建文件的過程並不是特別可操作的,所以我無法自己終止它;通過查明它何時創建了一個特定的文件,我可以在那一刻知道終止它是可以的。不幸的是,我不能使用一個簡單的killall
或等價物,因爲可能有多個實例在運行,而我只想殺死特定的實例。
謝謝!奇怪的是,這並沒有在Cygwin kill man頁面中記錄。但是,它確實與Cygwin版本的kill相配合。 – 2009-02-09 10:15:06