检查进程是否存在

检查进程是否存在

我想编写一个接受进程名称的脚本(我每次都会询问用户进程名称,然后在同一行上提示),如果进程存在,它将打印“存在”或者如果没有“不存在”取决于系统上当前是否存在这样的进程。

例子:

Enter the name of process: bash
exists
Enter the name of process: bluesky
does not exist

我的代码:

#!/bin/bash
while true
do
read -p "Enter the name of process: "
 if [ pidof -x > 0 ]; then
    echo "exists"   
 else    
    echo "does not exist"
 fi 
done 

我收到的错误消息。

pidof: unary operator expected

答案1

这里有几件事需要纠正。

首先,虽然你通过 请求用户输入read,但你实际上并没有在任何地方使用结果。默认情况下,read将读取的内容分配给名为的变量,REPLY因此你会想要pidof -x "$REPLY"

其次,在[ ... ]POSIX 测试括号内,>具有其作为重定向运算符1 的普通含义。如果您检查当前目录,您可能会看到它现在包含一个名为 的文件0。整数“大于”测试是-gt

第三,测试pidof -x内部[ ... ]只是一个字符串;将其作为命令执行并捕获所需的结果命令替换

[ "$(pidof -x "$REPLY")" -gt 0 ]

但是,pidof如果找到多个匹配的进程,可能会返回多个整数 - 这将导致另一个错误。因此我建议改为使用退出状态直接pidof

EXIT STATUS
       0      At least one program was found with the requested name.

       1      No program was found with the requested name.

所以你可以

#!/bin/bash
while true
do
read -p "Enter the name of process: "
 if pidof -qx "$REPLY"; then
    echo "exists"
 else
    echo "does not exist"
 fi
done

1在 bash 中[[ ... ]] 延伸测试>是一个比较运算符 - 但是它执行的是字典顺序比较而不是数字比较,所以你仍然需要-gt它。你可以但是用于>算术结构内部的整数比较(( ... ))

答案2

这是错误的测试。我的意思是,你问的是(好吧,你想问,但语法有问题)“PID 是否大于 0”,而你应该问的是“至少有一个 PID 吗”。你可以使用pidof -q它来检查是否存在:

$ pidof -q bash && echo "exists" || echo "does not exist"
exists
$ pidof -q randomthing && echo "exists" || echo "does not exist"
does not exist

您的脚本存在很多问题。首先,当您使用read不带变量的脚本时,值存储在特殊变量中$REPLY,但您并未使用它。相反,您运行的脚本pidox -x没有参数,因此始终不会返回任何内容。您想要的是类似这样的脚本:

read -p "Enter the name of process: "
if pidof -x "$REPLY"; then ...

但无论如何,在启动脚本后,请避免要求用户输入。这只意味着您的脚本无法自动化,用户可能会输入错误的值,整个过程将变得更难使用,而且没有任何好处。相反,请将进程名称作为参数读取。

把所有这些放在一起,你会得到如下结果:

#!/bin/bash


if pidof -qx "$1"; then
    echo "There is at least one running process named '$1'"
 else    
    echo "There are no running processes named '$1'."
 fi 

像这样运行:

script.sh processName

例如:

script.sh bash

相关内容