【问题标题】:Bash process id queryBash进程id查询
【发布时间】:2016-10-05 07:05:10
【问题描述】:

我刚刚看到一个代码,如果为

 for x in `ps -ef | awk '{ print $2 }'`
    do
        if [ "$x" != "PID" ];then
        ----- do something -----
        fi
    done 

我可以知道为什么我们需要检查它是否以及它在做什么?

【问题讨论】:

  • 您是否运行了生成for 循环输入的命令?
  • 您可以通过将awk 语句稍微修改为ps -ef | awk 'NR>1{print $2}' 来删除if condition。这将跳过标题。
  • 或者,不要使用-f 打印您丢弃的信息,而是使用for x in $(ps -e -o pid=); do ...
  • 错过了一件愚蠢的事情......无论如何,非常感谢大家:)

标签: bash pid


【解决方案1】:

添加该检查以跳过标题部分。您可以通过修改 awk 语句以跳过第一行来删除整个 if 语句。找出运行 ps -eaf |head -n 1 的标头。

  for x in $(ps -ef | awk 'NR>1{ print $2 }')
    do
          --------Do something with $x---------
    done

【讨论】:

  • 附加信息:ps 的一些实现有一个标志来省略写标题 - 请查阅你的手册页。这可以简化脚本,但以可移植性为代价。
【解决方案2】:

如果你运行ps -ef,你会注意到它会打印一个标题:

     UID     PID    PPID  TTY        STIME COMMAND
[...]

检查跳过标题。

【讨论】:

    【解决方案3】:

    ps -ef | awk '{ print $2 }' 输出如下;第一行是PID,所以如果使用statetement排除PID行;

    user@host:/tmp$ ps -ef | awk '{ print $2 }' | head
    PID
    1
    2
    3
    5
    7
    8
    9
    10
    

    你也可以不使用 if; 来使用它

    #!/bin/bash
    for x in `ps -ef | awk '{ print $2 }' | grep -v PID`
    do
        #----- do something -----
        echo $x
    done
    

    【讨论】:

      猜你喜欢
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2014-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多