Bash 如何搜索PID?(猛击)

Bash 如何搜索PID?(猛击),bash,search,pid,Bash,Search,Pid,假设我知道一个进程的PID,并且想在ps-a中进行搜索,我该怎么做?我试着这样做: echo "Enter PID to search: " read PID search=$(ps -A | grep -v PID | awk '{print $1}') 这将返回一个很长的PID列表。因此,我如何使用输出的每个单独值并执行以下操作: if [ "$PID" = "*each_value_in_search_list*" ]; then ........ 在本例中,我试图将用户输入的内容与

假设我知道一个进程的PID,并且想在ps-a中进行搜索,我该怎么做?我试着这样做:

echo "Enter PID to search: "
read PID
search=$(ps -A | grep -v PID | awk '{print $1}') 
这将返回一个很长的PID列表。因此,我如何使用输出的每个单独值并执行以下操作:

if [ "$PID" = "*each_value_in_search_list*" ]; then
........
在本例中,我试图将用户输入的内容与命令的输出进行比较,那么我该如何做呢?首先,我的做法正确吗?还是有其他方法可以做到这一点


谢谢你的帮助,每个回答这个问题的人。(:

您正在为所有不包含文本字符串“PID”的行对
ps
的输出进行灰显。您希望使用
$PID
而不是使用名为PID的变量,而不是文本“PID”。此外,由于您不希望在与PID匹配的其他字段上出现误报,只需在第一列上匹配即可:

search=$(ps -A | grep "^ *$PID\>" | awk '{print $1}')
“\>”
转义序列与单词末尾的空字符串匹配

某些版本的
ps
支持
-p
选项,仅提供有关特定PID的信息,因此您不需要grep或awk:

search=$(ps -p $PID)

grep的-v开关执行反向搜索,换言之,您将获得您不想要的所有内容。设置变量后,您还应该引用前缀为$的变量

试试这个

#!/bin/bash

echo "Enter PID to search: "
read PID
search=$(ps --pid $PID -o comm=)

if [ $search ]
    then
        echo "Program: $search"
    else
        echo "No program found with PID: $PID"
fi
您的
“grep-vpid”
是删除标题行的标准技巧,而不是从输出中获取实际PID细节的方法

如果您只需要该流程的详细信息,只需使用:

search=$(ps -A | awk -v pid=$PID '$1==pid{print pid}')
这将把search设置为有问题的PID(如果它存在),或者设置为空字符串(否则,这就是您想要的)


对PID进行盲搜索(与使用awk检查第1列相反)存在一个问题,即您可能会在PID显示在命令字符串中的位置拾取行。

如果问题的根源是检查输入的PID是否对应于流程条目(根)。更具体地说,如果您能够向该进程(用户)发送信号:


当然,这可能根本不是你想要的。我可以随意“解释”一下你的问题;)

您可以使用
grep
而不是
grep

我不明白您为什么要为grep使用
-v
标志。我试图删除headingPOSIX ps支持-p选项-因此,您很可能无法在不支持它的合理最新机器上找到ps。:)<代码>--pid在BSD
ps
上不受支持。
-p
选项似乎更可取。
if kill -0 $PID >/dev/null 2>&1; then ...
<?php
echo shell_exec("ps -Ao cmd,pid|grep -P ' {$pid}$'");
?>