2016-05-11 172 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