gpt4 book ai didi

linux bash 不显示作业消息

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:37 25 4
gpt4 key购买 nike

输入kill 来终止或停止进程后,我没有收到作业消息。所以我不知道我的命令是否被接受。为什么我的 bash 在命令终止后不显示消息?我在 VirtualBox 中使用 Ubuntu 12。

最佳答案

如果您发出 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

关于linux bash 不显示作业消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37152472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com