2016-05-11 7 views
-1

プロセスを終了するか停止するためにkillを入力した後で、ジョブメッセージが表示されません。だから私は私の命令が受け入れられるかどうかわからない。なぜ私のbashはコマンドを殺した後にメッセージを表示しないのですか? 私はVirtualBox内でUbuntu 12を使用しています。linux bashがジョブメッセージを表示しない

+0

のようになります。あなたは、現在のシェルのジョブとしてそれらを実行していますか? –

+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 

ビットマスクは16進数です。ビット番号Nが設定されている場合、ビットマスクには番号Nの信号が含まれます(ビット番号は1から始まるものとします)。

したがって、信号数signum、我々は、信号は、次式(擬似コード)とビットマスクに存在するかどうかを調べることができるビットマスクm有する:

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

を我々は1(0x1の)をシフトsignum - 1ビットで左に移動し、ビット単位でANDの操作をmaskに適用します。 signumのビットが設定されている場合、結果はゼロ以外です。

PIDの保留中、ブロック中、無視中、および捕捉済みのシグナルの数を出力するBashスクリプトを作成しました。

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 

使用法:$pidプロセス番号

./pidsig.sh $pid 

。実行可能にすることを忘れないでください:chmod +x pidsig.sh

出力は次

======== SigPnd: (0000000000000000) =========== 
======== SigBlk: (0000000000000000) =========== 
======== SigIgn: (0000000001001000) =========== 
SIGXFSZ  16777216 
SIGPIPE  4096 
======== SigCgt: (0000000180010002) =========== 
SIGCHLD  65536 
SIGINT  2 
関連する問題