2016-05-11 98 views
-1

輸入kill終止進程或停止進程後,我沒有收到任務消息。所以我不知道我的命令是否被接受。爲什麼我的bash在命令殺死後不顯示消息? 我在VirtualBox內使用Ubuntu 12。linux bash沒有顯示任務消息

+0

你運行它們作爲當前shell的工作? –

+0

不好意思,但是這個Q不是關於爲StackOverflow定義的編程。它可能**更適合於相關網站,http://askubuntu.com或http://unix.stackexchange.com(Unix和Linux)。考慮使用Q底部的標誌鏈接並請主持人移動它。請不要在2個不同的網站上發佈相同的Q.謝謝你,祝你好運。 – shellter

+0

http://unix.stackexchange.com/questions ...不是編程問題,還是我錯過了那部分?要(可能?)回答你的問題:如果你正在殺的工作是背景,並且在相同的bash實例下運行,bash只會給你反饋。 – tink

回答

1

如果您正在簽發kill,那麼您知道進程ID(PID)。有了PID,您可以獲取大量關於流程的信息,如果它仍然存在的話。

例如,下面的命令將打印位掩碼爲阻塞,捕獲,忽略,掛起信號:

pid=1189 
ps -p $pid -o blocked,caught,ignored,pending,s,args 

詳見man ps。輸出如下所示:

 BLOCKED   CAUGHT   IGNORED   PENDING S COMMAND 
0000000000000000 0000000180010002 0000000001001000 0000000000000000 S /usr/bin/python2.7 /usr/lib/py 

如果進程不存在,則命令失敗。你會問你怎麼知道命令是否失敗,如果它什麼都不輸出的話。那麼,這就是您可以檢查包含前一個命令的退出狀態的$?變量的值的位置。如果它不是零,那麼以前的命令失敗。例如:

[ $? -eq 0 ] && echo 'success' 

的另一種方法是解析/proc/$pid/status

grep -i sig /proc/$pid/status 

SigQ: 0/15042 
SigPnd: 0000000000000000 
SigBlk: 0000000000000000 
SigIgn: 0000000001001000 
SigCgt: 0000000180010002 

的位掩碼是十六進制數字。如果位號N置位,則位掩碼包含編號爲N的信號(假設位編號從1開始)。

因此,具有信號數signum和一個位掩碼m我們可以發現在所述位掩碼中是否存在用下列公式(僞碼)信號:

exists = mask & (1 << signum - 1) 

我們移位1(爲0x1)向左邊signum - 1位,然後在mask上應用按位AND操作。如果設置了signum的位,則結果爲非零。

我寫了一個Bash腳本,它打印PID的掛起,阻塞,忽略和捕獲信號的數量。

pidsig.sh

#!/bin/bash - 
declare -i pid 
declare -A sigmap 

pid=$1 

# Construct an array from the list of signal names and numbers 
a=(`kill -l | sed -r 's~[)\t ]+~ ~g'`) 

# Build signal name-to-number map 
i=0 
while [ $i -lt ${#a[@]} ] 
do 
    v=${a[$i]} 

    ((++i)) 
    k=${a[$i]} 

    sigmap[$k]=$v 

    ((++i)) 
done 

# Fetch signal info from /proc/$pid/status, 
# then print how many times the process caught each type of signal. 
grep -P '^Sig\w{3}' /proc/$pid/status | while read -r -a line 
do 
    title="${line[0]}" 
    mask=${line[1]} 

    echo "======== $title ($mask) ===========" 

    for k in "${!sigmap[@]}" 
    do 
    signum=${sigmap[$k]} 
    #echo "k: $k v: $signum" 

    # convert mask to decimal number, save into $m 
    let "m = 0x$mask" 

    # shift 1 to the left by `signum - 1` bits 
    num_caught=$(($m & (1 << signum - 1))) 

    # ignore zeroes 
    [ $num_caught -eq 0 ] || printf "%-14s%s\n" $k $num_caught 
    done 
done 

用法:

./pidsig.sh $pid 

其中$pid是進程號。不要忘記讓它可執行:chmod +x pidsig.sh

輸出將類似於以下

======== SigPnd: (0000000000000000) =========== 
======== SigBlk: (0000000000000000) =========== 
======== SigIgn: (0000000001001000) =========== 
SIGXFSZ  16777216 
SIGPIPE  4096 
======== SigCgt: (0000000180010002) =========== 
SIGCHLD  65536 
SIGINT  2