2012-10-31 101 views

回答

9
​​

。這是zsh,不需要外部工具。

如果你想殺死作業號N:

function killjob() 
{ 
    emulate -L zsh 
    for jobnum in [email protected] ; do 
     kill ${${jobstates[$jobnum]##*:*:}%=*} 
    done 
} 
killjob N 
+0

作爲'zsh' noob,介意解釋第一行? –

+1

@ZachRiggle它在'man zshexpn'和'man zshmodules'中:'$ jobstates'是一個關聯數組參數,'(v)'只選擇這個數組中的值,'#'使zsh從開始字符串,選擇刪除最少冗長模式,'*:*:':使zsh刪除每個值的前兩個冒號分隔字段的模式(數組參數上的'#'應用於每個值),'%'類似'#',但是對於字符串結尾和'= *'會使zsh在包含符號本身的最後一個符號之後移除所有內容。每個'$ jobstates'的值看起來像'job-state:mark:pid = state ...'。 – ZyX

+0

看來我在這裏有一個錯誤:如果整個管道被暫停,它不起作用。 – ZyX

0
alias killbg='for job in \`jobs -l | egrep -o "([0-9][0-9]+)"`; 
+0

超級!現在嘗試暫停'echo 123 |少「,並檢查它會殺死什麼。提示:當你運行'kill'時,'echo123'進程已經死了,它的PID可能已經被佔用了。因此,對於這種使用'killbg'掛起的管道,你可能會殺死兩個無辜的進程:處理'123'('echo'參數)和重發'echo' PID的進程。 – ZyX

+0

我的解決方案在這種情況下會失敗(它會嘗試殺死'{echoPID} = done:{lessPID}')。 – ZyX

0

這同時適用於ZSH和Bash:

: ' 
killjobs - Run kill on all jobs in a Bash or ZSH shell, allowing one to optionally pass in kill parameters 

Usage: killjobs [zsh-kill-options | bash-kill-options] 

With no options, it sends `SIGTERM` to all jobs. 
' 
killjobs() { 

    local kill_list="$(jobs)" 
    if [ -n "$kill_list" ]; then 
     # this runs the shell builtin kill, not unix kill, otherwise jobspecs cannot be killed 
     # the `[email protected]` list must not be quoted to allow one to pass any number parameters into the kill 
     # the kill list must not be quoted to allow the shell builtin kill to recognise them as jobspec parameters 
     kill [email protected] $(sed --regexp-extended --quiet 's/\[([[:digit:]]+)\].*/%\1/gp' <<< "$kill_list" | tr '\n' ' ') 
    else 
     return 0 
    fi 

} 

@zyx答案並沒有爲我工作。

更多在這裏:https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4

0

小的調整@ ZXY的迴應......

在我的系統,我發現,暫停的作業不使用默認的終止信號正常死亡。我不得不將其更改爲kill -KILL以使suspended後臺作業正常死亡。

alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}' 

請特別注意周圍的單引號。如果您切換到雙引號,則需要轉義每個「$」。請注意,您不能使用function來包裝此命令,因爲該函數將增加$jobstates數組,導致該函數嘗試自行查殺......必須使用別名。

以上killjob腳本是有點多餘,因爲你可以這樣做:

kill %1 

更少的鍵盤操作和它已經建成zsh

0

builtin kill %1

killutil-linux包位於/usr/bin/kill

不支持工作(kill: cannot find procses "%1"

使用關鍵字builtin,以避免名稱衝突

二進制