代码之家  ›  专栏  ›  技术社区  ›  Richard H

如何检查进程id(PID)是否存在

  •  152
  • Richard H  · 技术社区  · 15 年前

    if [ a process exists with $PID ]; then
    
        kill $PID 
    
    fi
    

    条件语句的适当表达式是什么?

    10 回复  |  直到 7 年前
        1
  •  200
  •   Christoffer Hammarström    7 年前

    kill -0 $pid
    

    但正如@unwind所说,如果你想杀了它,就

    kill $pid
    

    如果要忽略 kill 根据出口代码做点什么,你可以

    if ! kill $pid > /dev/null 2>&1; then
        echo "Could not send SIGTERM to process $pid" >&2
    fi
    
        2
  •  287
  •   FDS    12 年前

    if ps -p $PID > /dev/null
    then
       echo "$PID is running"
       # Do something knowing the pid exists, i.e. the process with $PID is running
    fi
    

    问题在于:

    kill -0 $PID
    

    退出代码将是非零的,即使pid正在运行并且您没有权限终止它。例如:

    kill -0 1
    

    kill -0 $non-running-pid
    

    对于普通用户有一个无法区分的(非零)退出代码,但是init进程(PID 1)肯定正在运行。

    如果测试的主体是“杀戮”,那么讨论杀戮和种族条件的答案是完全正确的。我是来找将军的” 如何在bash中测试PID的存在性 ".

    /proc方法很有意思,但在某种意义上打破了“ps”命令抽象的精神,也就是说,你不需要去寻找/proc,因为如果Linus决定调用“exe”文件做别的什么呢?

        3
  •  75
  •   Radostin Stoyanov user2683246    7 年前
    if [ -n "$PID" -a -e /proc/$PID ]; then
        echo "process exists"
    fi
    

    if [ -n "$(ps -p $PID -o pid=)" ]
    

    在后一种形式中, -o pid= necessary 对于非空字符串运算符 -n

        4
  •  39
  •   devnull    12 年前

    ps 命令 -p $PID 可以这样做:

    $ ps -p 3531
      PID TTY          TIME CMD
     3531 ?        00:03:07 emacs
    
        5
  •  11
  •   elcuco    9 年前

    你有两种方法:

    让我们先在我的笔记本电脑中寻找一个特定的应用程序:

    [root@pinky:~]# ps fax | grep mozilla
     3358 ?        S      0:00  \_ /bin/sh /usr/lib/firefox-3.5/run-mozilla.sh /usr/lib/firefox-3.5/firefox
    16198 pts/2    S+     0:00              \_ grep mozilla
    

    现在所有示例都将查找PID 3358。

    :对第二列中的PID运行“ps aux”和grep。在本例中,我查找firefox,然后查找它的PID:

    [root@pinky:~]# ps aux | awk '{print $2 }' | grep 3358
    3358
    

    if [ ps aux | awk '{print $2 }' | grep -q $PID 2> /dev/null ]; then
        kill $PID 
    fi
    

    第二条路 /proc/$PID 目录。我在这个例子中使用“exe”,但是你可以使用其他任何东西。

    [root@pinky:~]# ls -l /proc/3358/exe 
    lrwxrwxrwx. 1 elcuco elcuco 0 2010-06-15 12:33 /proc/3358/exe -> /bin/bash
    

    if [ -f /proc/$PID/exe ]; then
        kill $PID 
    fi
    

    顺便问一下:有什么问题吗 kill -9 $PID || true ?


    编辑:

        6
  •  8
  •   Gagan Gami    11 年前

    好像你想要

    wait $PID
    

    什么时候回来 $pid

    否则你可以用

    ps -p $PID
    

    检查进程是否仍处于活动状态(这比 kill -0 $pid 因为即使你没有pid,它也能工作)。

        7
  •  7
  •   unwind    15 年前

    我认为这是一个糟糕的解决方案,它为比赛条件敞开了大门。如果在你的测试和你的杀戮之间这个过程就结束了呢?那么杀戮就会失败。那么,为什么不在所有情况下都尝试kill,并检查其返回值以了解其运行情况呢?

        8
  •  1
  •   Alberto Salvia Novella    4 年前

    pid :

    pgrep [pid] >/dev/null
    

    名称 :

    pgrep -u [user] -x [name] >/dev/null
    

    " -十 意思是“完全匹配”。

        9
  •  0
  •   invalidmagic    9 年前

    在这里,我将PID存储在一个名为.PID的文件中(类似于/run/…),并且仅在尚未执行的情况下执行脚本。

    #!/bin/bash
    if [ -f .pid ]; then
      read pid < .pid
      echo $pid
      ps -p $pid > /dev/null
      r=$?
      if [ $r -eq 0 ]; then
        echo "$pid is currently running, not executing $0 twice, exiting now..."
        exit 1
      fi
    fi
    
    echo $$ > .pid
    
    # do things here
    
    rm .pid
    

    注: 存在争用条件,因为它不检查如何调用pid。如果系统重新启动并且.pid存在,但被其他应用程序使用,这可能会导致“不可预见的后果”。

        10
  •  0
  •   Alexis Wilke    8 年前

    Pid=$(pidof `process_name`)
    
    if [ $Pid > 0 ]; then
    
       do something
    else
    
       do something
    fi 
    

    或者类似的

    Pin=$(ps -A | grep name | awk 'print $4}')
    echo $PIN
    

    这会显示应用程序的名称,只是没有ID的名称。