拿這個腳本,僅僅作爲一個例子殺eval'ed過程
#!/bin/sh
foo()
{
eval "[email protected]"
}
touch bar
foo tail -f bar &
sleep 1
kill $!
在這個例子中,我想殺死tail
,但是因爲tail
被調用爲eval
的結果,它不會被打死。我怎麼可以殺tail
,而不訴諸pgrep
,pkill
等?
拿這個腳本,僅僅作爲一個例子殺eval'ed過程
#!/bin/sh
foo()
{
eval "[email protected]"
}
touch bar
foo tail -f bar &
sleep 1
kill $!
在這個例子中,我想殺死tail
,但是因爲tail
被調用爲eval
的結果,它不會被打死。我怎麼可以殺tail
,而不訴諸pgrep
,pkill
等?
使用exec
而是應該努力
#!/bin/sh
foo()
{
exec "[email protected]"
}
touch bar
foo tail -f bar &
sleep 1
kill $!
如果與管道使用,你需要做的進程替換
foo tail -f bar > >(tee baz) &
這是因爲,當你kill $!
,它實際上子外殼(foo &),這是與SIGTERM
死亡。你沒有殺死tail
命令。
正如svnpenn所提到的,要麼使用exec
,以便子shell的PID由tail
繼承。
或者使用下面的代碼樹遍歷:
kill `ps -C tail --ppid $! -opid=`
它會列出所有尾部處理(-C tail
),其PID爲$! (--ppid $!
)&只能打印它的PID -opid=
&然後殺死那個PID。
你試圖解決的實際問題是什麼?你在這裏一次做幾件無用的事情。 – ormaaj