输入kill终止进程或停止进程后,我没有收到任务消息。所以我不知道我的命令是否被接受。为什么我的bash在命令杀死后不显示消息? 我在VirtualBox内使用Ubuntu 12。linux bash没有显示任务消息
-1
A
回答
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
相关问题
- 1. JOptionPane.showMessageDialog()显示但没有任何消息?
- 2. Console.WriteLine没有显示消息
- 3. 消息框没有显示
- 4. django消息没有显示
- 5. AddModelError消息没有显示
- 6. 有没有办法显示任何Dr.Retet Exception的信息消息?
- 7. 显示任务ALT + TAB,但没有显示在任务栏
- 8. 在Windows Phone中显示没有任何按钮的消息
- 9. Xcode- Chartboost SDK没有在日志中显示任何消息
- 10. MySQL没有显示任何错误消息
- 11. 如何显示C#中没有任何按钮的消息框
- 12. 在bash,有没有死“错误消息”
- 13. log4j消息日志中没有显示
- 14. CakePHP 2.6 flash消息没有显示
- 15. nested_messages没有显示以前的消息
- 16. Django 1.6 - 消息没有显示
- 17. asp.net JavaScript消息没有显示出来
- 18. 显示消息时没有行发现
- 19. 没有正确显示消息
- 20. 消息框显示没有空格吗?
- 21. 豆:消息没有显示出来
- 22. Catlina.out没有显示记录的消息
- 23. CakePHP没有显示flash()消息?
- 24. Django 1.6消息没有显示
- 25. 模拟器没有显示消息框
- 26. Django的消息框架没有显示消息模板
- 27. ng消息没有正确显示消息
- 28. 在onMessageReceived中没有显示ToMessageReceived的FireBase Colud消息服务
- 29. 耙RSpec任务没有显示
- 30. Wix:显示有条件的消息框没有取消
你运行它们作为当前shell的工作? –
不好意思,但是这个Q不是关于为StackOverflow定义的编程。它可能**更适合于相关网站,http://askubuntu.com或http://unix.stackexchange.com(Unix和Linux)。考虑使用Q底部的标志链接并请主持人移动它。请不要在2个不同的网站上发布相同的Q.谢谢你,祝你好运。 – shellter
http://unix.stackexchange.com/questions ...不是编程问题,还是我错过了那部分?要(可能?)回答你的问题:如果你正在杀的工作是背景,并且在相同的bash实例下运行,bash只会给你反馈。 – tink