2012-12-31 16 views
0

拿這個腳本,僅僅作爲一個例子殺eval'ed過程

#!/bin/sh 

foo() 
{ 
    eval "[email protected]" 
} 

touch bar 
foo tail -f bar & 
sleep 1 
kill $! 

在這個例子中,我想殺死tail,但是因爲tail被調用爲eval的結果,它不會被打死。我怎麼可以殺tail,而不訴諸pgreppkill等?

+1

你試圖解決的實際問題是什麼?你在這裏一次做幾件無用的事情。 – ormaaj

回答

0

使用exec而是應該努力

#!/bin/sh 

foo() 
{ 
    exec "[email protected]" 
} 

touch bar 
foo tail -f bar & 
sleep 1 
kill $! 

如果與管道使用,你需要做的進程替換

foo tail -f bar > >(tee baz) & 

related

1

這是因爲,當你kill $!,它實際上子外殼(foo &),這是與SIGTERM死亡。你沒有殺死tail命令。

正如svnpenn所提到的,要麼使用exec,以便子shell的PID由tail繼承。

或者使用下面的代碼樹遍歷:

kill `ps -C tail --ppid $! -opid=` 

它會列出所有尾部處理(-C tail),其PID爲$! (--ppid $!)&只能打印它的PID -opid= &然後殺死那個PID。