观察不显示脚本的输出

观察不显示脚本的输出

我有一个简单的脚本,它只使用 awk 从ps.当我在终端上运行它时,它工作正常。但是,当我用 watch 运行这个脚本时:

watch bench_run.sh

根本没有输出。

脚本如下

#!/bin/bash

bench_run() {
    local awk_cmd='
        {
            time=$10
            bench=$46

            start=match(bench, /throughput/)
            start+=(RLENGTH+1)
            end=match(bench, /base/)
            printf ("%s %s\n", time, substr(bench, start, end-start-1))
        }
    '

    ps aux | grep $USER | grep simulator | awk "$awk_cmd"
}

bench_run

手表不打印任何输出的原因可能是什么?

答案1

尝试替换ps auxps auxww以获得全宽输出。 ps可能正在测试您的输入或 tty 并决定在内部采取不同的行为watch

答案2

这是改进版本的开始。到目前为止,我已将其更改为:

  • 去掉greps (awk可以进行正则表达式匹配)
  • 更好地利用ps选项
  • 摆脱了奇怪的 awk_cmd 局部变量
  • 引用 $1 和 $46(现在是 $37,从ps输出中删除了 9 个不需要的字段)
#!/bin/bash

bench_run() {

    ps -u "$USER" -o time,args | awk "/simulator/ {
            time=\$1
            bench=\$37

            start=match(bench, /throughput/)
            start+=(RLENGTH+1)
            end=match(bench, /base/)
            printf ("%s %s\n", time, substr(bench, start, end-start-1))
            }
    "
}

bench_run

这是一个使用的版本sed

#! /bin/sh
watch 'ps -u "$USER" -o time,args | 
       sed -n -e "/[s]imulator/ s/\([^ ]*\) .*\(throughput.*\)base.*/\1 \2/ p"'

我在 watch 命令周围使用了'单引号,因此我"在其中的 sed 命令周围使用了双引号。

如果simulator是进程的全名,您可以使用:

#! /bin/sh
watch 'ps -o time,args -C simulator | 
       sed -n -e "s/\([^ ]*\) .*\(throughput.*\)base.*/\1 \2/ p"'

相关内容