3

假设我知道进程的 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
........

在这种情况下,我试图将用户输入的内容与我的命令输出进行比较,那么我该怎么做呢?我首先做的是正确的方式吗?或者有没有其他方法可以做到这一点?

感谢您的帮助,所有回答此问题的人。(:

4

6 回答 6

5

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
于 2009-05-25T03:53:33.573 回答
3

您正在ps搜索不包含文字字符串“PID”的所有行的输出。您想改用$PID名为 PID 的变量而不是文字“PID”。此外,由于您不希望与 PID 匹配的其他字段出现误报,因此只需匹配第一列:

search=$(ps -A | grep "^ *$PID\>" | awk '{print $1}')

"\>"转义序列匹配单词末尾的空字符串。

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

search=$(ps -p $PID)
于 2009-05-25T03:48:35.353 回答
3

"grep -v PID"是删除标题行的标准技巧,而不是从输出中获取实际 PID 详细信息的方法。

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

search=$(ps -A | awk -v pid=$PID '$1==pid{print pid}')

如果它存在,这会将搜索设置为有问题的 PID,否则设置为空字符串,这就是您想要的。

对 PID 进行盲搜索(而不是用 来检查第 1 列awk)存在一个问题,即您可能会选择该 PID 在命令字符串中显示的行。

于 2009-05-25T04:05:36.787 回答
3

grep您可以使用-p选项将 PID 直接传递给ps命令,而不是使用。

于 2009-05-25T06:39:57.053 回答
2

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

if kill -0 $PID >/dev/null 2>&1; then ...

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

于 2009-05-25T05:39:21.740 回答
0
<?php
echo shell_exec("ps -Ao cmd,pid|grep -P ' {$pid}$'");
?>
于 2011-04-12T09:39:26.727 回答