我正在创建一个 shell 脚本,其中我需要过滤除自己的 grep 进程之外的进程。如果我使用:
echo "step1"
psout=`ps -aux | grep 'deluged'| grep '58846'`
echo "step2"
echo $psout
...
然后停止脚本意味着第2步不显示!和$psout,输出空白。我不知道为什么。
如果我尝试使用 for AND 和 except颜色:
$ ps -aux | grep -e 'deluged' -e '58846' -v "color"
grep: color: No such file or directory
如果我尝试使用 Keychain:
ps -aux | grep -e "[d]eluged"."58846"
Blank OUTPUT
简而言之,如何使用 AND 和 except 自己的 grep 进程来查找单个 grep 进程?
答案1
您在评论中说过,您想知道进程是否存在。使用pgrep -f 'deluge'
这个。或者pgrep -f 'deluge.*58846'
pgrep 专门设计用于在进程存在时为您提供 pid,并避免使用 grep 和 ps 进行解析的问题。如果进程不存在,那么您将得到空白输出
您还可以使用sudo netstat -tulpan
grep 来查看您的端口号是否在开放端口号之中。
答案2
您可以使用ps aux | grep processname | grep -v 'grep'
第一个grep
选择包含进程名称的所有行,第二个grep
删除grep-line从输出
答案3
问题是这-v
不是一个 except 选项,它实际上意味着匹配被反转。因此,你将打印所有行不匹配‘deluged’ 和 ‘58846’。
-v
由于不接受参数,因此生成了错误消息,因此该grep
命令正在尝试对文件“color”进行操作。
为了达到预期的结果,您应该使用pgrep
通过管道传输到 grep 的命令:
pgrep -a 'deluged' | grep -e '58846'
这将输出一行,其中包括命令中编号为 58846 的大量进程的 PID 和完整命令。
如果您希望变量psout
包含 0 或任何其他选定的字符串,则如果命令成功执行:
psout=$((pgrep -a deluged | grep 58846) > /dev/null && echo "0")
echo $psout
0