在ps中被列为(bash)的进程,尽管对它们进行了即时监视

在ps中被列为(bash)的进程,尽管对它们进行了即时监视,bash,awk,process,background-process,ps,Bash,Awk,Process,Background Process,Ps,我试图获得一些短期流程的流程信息,所以我制作了一个测试脚本来帮助我 我启动了一个运行连续循环的后台任务,将ps的输出输送到awk以寻找新的进程。循环以处理器允许的速度运行。为了测试我的程序,我启动脚本,然后运行一些后台sleep任务。像这样: watchPIDs 10 sleep 1& sleep 2& sleep 3& 上面的10意味着让我的脚本运行10秒钟。尽管循环以处理器允许的速度运行,但我认为一些睡眠命令在某些东西注册之前“生存和死亡”,这会把我的结果搞砸。。。

我试图获得一些短期流程的流程信息,所以我制作了一个测试脚本来帮助我

我启动了一个运行连续循环的后台任务,将
ps
的输出输送到
awk
以寻找新的进程。循环以处理器允许的速度运行。为了测试我的程序,我启动脚本,然后运行一些后台
sleep
任务。像这样:

watchPIDs 10
sleep 1&
sleep 2&
sleep 3&
上面的
10
意味着让我的脚本运行10秒钟。尽管循环以处理器允许的速度运行,但我认为一些睡眠命令在某些东西注册之前“生存和死亡”,这会把我的结果搞砸。。。有时,我会看到上面示例中的
sleep 1
过程显示为
(bash)
(在
bash
)而不是
sleep 1

用谷歌搜索括号命名法会出现:

括号表示命令重写了其名称,或者 ps找不到名称,ps正在打印名称 “会计名称。”

我不太确定这是否适用于这里,或者可能我不理解某些东西。。。这可能是我的脚本中的一些错误,我不明白。。。否则,当我几乎可以肯定我的脚本运行得足够快,可以在进程死之前“看到”该进程时(毕竟,它确实得到了该进程的正确
PID
),为什么我不总是为该进程取名称
sleep 1

这是我的代码(主要是
awk
):


谢谢

您似乎在前台运行循环并将其管道化,这样一个子shell将在后台运行,调用awk,然后(
exec
)将当前进程替换为该子shell。老实说,我不确定这样做的净效果是什么,但在调试时,您当然不应该有
2>/dev/null
,如果有的话,您可以使用
bash-x watchPIDs 10
运行它,以实际查看它在做什么

在任何情况下,请尝试此选项(未测试,因为my
ps
没有
-o
选项):

#/usr/bin/env bash
watchPIDs()
{
[“${1}”]|{echo“未指定持续时间,正在退出…”>&2;返回1;}
{
set+bm
结束=$($(日期+%s)+$1))
while(($(日期+%s)<$end));do ps-o pid=,ppid=,pgid=,command=;done|
awk'BEGIN{fmt=“%-10.10s%-10.10s%-10.10s%-.70s\n”}
{
旧=0
对于(pid中的pid)如果(pid[pid]=$1){old=1;break;}
如果(旧==0){
pids[++i]=1美元
匹配($0,“*”$1”+“$2”+“$3”)
pidInfo[i]=sprintf(fmt,$1,$2,$3,substr($0,RLENGTH))
}
}结束{
打印“”
printf fmt,“PID”、“PPID”、“PGID”、“命令”

对于(j=1;j您似乎在前台运行循环,并将其管道化,这样一个子shell将在后台运行,调用awk,但是(
exec
)用子shell替换当前进程。老实说,我不确定这样做的净效果是什么,但在调试时,您当然不应该有
2>/dev/null
,您可以使用
bash-x watchPIDs 10
运行它,以实际查看它在做什么

在任何情况下,请尝试此选项(未测试,因为my
ps
没有
-o
选项):

!/usr/bin/env bash
watchPIDs()
{
[“${1}”]|{echo“未指定持续时间,正在退出…”>&2;返回1;}
{
set+bm
结束=$($(日期+%s)+$1))
while(($(日期+%s)<$end));do ps-o pid=,ppid=,pgid=,command=;done|
awk'BEGIN{fmt=“%-10.10s%-10.10s%-10.10s%-.70s\n”}
{
旧=0
对于(pid中的pid)如果(pid[pid]=$1){old=1;break;}
如果(旧==0){
pids[++i]=1美元
匹配($0,“*”$1”+“$2”+“$3”)
pidInfo[i]=sprintf(fmt,$1,$2,$3,substr($0,RLENGTH))
}
}结束{
打印“”
printf fmt,“PID”、“PPID”、“PGID”、“命令”

对于(j=1;j要运行
sleep
,Bash将首先调用,然后在子进程中调用以
sleep
替换自己。因此在
fork
execve
之间,子进程名称仍然是
Bash


(我不知道是谁加了括号。)

要运行
sleep
,Bash将首先调用,然后在子进程中调用以
sleep
替换自己。因此在
fork
execve
之间,子进程名称仍然是
Bash


(我不知道是谁添加了括号)

谢谢,这么多我真的赶上这个过程太早了,不是太晚了吗?好的信息,也许我会让我的脚本考虑更新的名字(要么替换现有的名字,要么在两列中跟踪它们)谢谢,这么多人,我真的赶上这个过程太早了,不是太晚了吗?好的信息,也许我会让我的脚本考虑更新的名字(要么替换现有的一个或跟踪两列)。感谢您的清理。
exec
主要是早期版本中的一些遗留代码,在早期版本中,我存储了整个后台进程和管道两侧的PID,并使用陷阱作为停止脚本的手段(现在我只使用
date+%s
)。我可能不再需要它了。不客气。我认为我发布的脚本将完全满足您的要求,请尝试并让我们知道。感谢您的清理。
exec
主要是早期版本的一些遗留代码,在早期版本中,我存储了整个后台进程和管道两侧的PID,并使用了陷阱a这是停止脚本的方法(现在我只使用
date+%s
)。我可能不再需要它了。不客气。
watchPIDs()
{
    [ "${1}" ] || { echo "No time duration specified, exiting..."; return -1; }
    set +bm
    end=$(( `date +%s` + ${1} ))
    {
        while [ `date +%s` -lt ${end} ]; do ps -o pid=,ppid=,pgid=,command=; done |
        exec awk ' BEGIN { fmt = "%-10.10s%-10.10s%-10.10s %-.70s\n"; }
        {
            old=0
            for ( pid in pids ) if ( pids[pid] == $1 ) { old = 1; break; }
            if ( old == 0 ) {
                pids[i++] = $1
                match($0, " *" $1 " +" $2 " +" $3 " " )
                pidInfo[i-1] = sprintf(fmt, $1, $2, $3, substr($0, RLENGTH))
            }
        } END {
            print ""
            printf fmt, "PID", "PPID", "PGID", "Command"
            for ( j = 0; j < i; j++ ) printf "%s", pidInfo[j]
        }' &
    } 2>/dev/null
}
PID       PPID      PGID       Command
62246     62245     62246       -bash
62573     62246     62246       -bash
62574     62246     62246       awk  BEGIN { fmt = "%-10.10s%-10.10s%-10.10s %-.70s\n"; }\012        
63097     62246     62246       (bash)
63552     62246     62246       sleep 2
63985     62246     62246       sleep 3
#!/usr/bin/env bash

watchPIDs()
{
    [ "${1}" ] || { echo "No time duration specified, exiting..." >&2; return 1; }

    {
        set +bm
        end=$(( $(date +%s) + $1 ))
        while (( $(date +%s) < $end )); do ps -o pid=,ppid=,pgid=,command=; done |
        awk ' BEGIN { fmt = "%-10.10s%-10.10s%-10.10s %-.70s\n"; }
        {
            old=0
            for ( pid in pids ) if ( pids[pid] == $1 ) { old = 1; break; }
            if ( old == 0 ) {
                pids[++i] = $1
                match($0, " *" $1 " +" $2 " +" $3 " " )
                pidInfo[i] = sprintf(fmt, $1, $2, $3, substr($0, RLENGTH))
            }
        } END {
            print ""
            printf fmt, "PID", "PPID", "PGID", "Command"
            for ( j = 1; j <= i; j++ ) print pidInfo[j]
        }'
    } &
}

watchPIDS "$@"