ps aux | grep firefox
列出具有字符串“firefox”的所有进程
ps aux | grep -v firefox
列出所有不带字符串“firefox”的进程
ps aux | grep -v grep | grep firefox
?
第二个 grep 的作用是什么? grep 本身是一个命令,那么为什么我们要 grep 另一个 grep 呢?
答案1
当您执行诸如以下命令时
ps aux | grep firefox
然后是grep
过程本身可能会显示在输出中,因为您要查找的单词已存在。例如在我的机器上我运行chrome
并得到类似的结果:
% ps aux | grep chrome
sweh 3384 0.0 0.0 11128 1024 pts/1 S+ 07:08 0:00 grep chrome
sweh 23698 0.0 0.0 6384 620 ? S Jul04 0:00 /usr/lib/chromi
我们可以看到进程 3384 是grep
命令并且匹配,因为单词铬合金出现。
为了避免这种情况,有些人会添加第二行| grep -v grep
来删除该行。
有一个欺骗尽管...
ps aux | grep '[f]irefox'
grep '[f]irefox'
与 完全相同的行匹配grep firefox
,但现在该grep
命令将永远不会匹配自身,因为该单词实际上并没有出现在该命令上。
答案2
该ps
命令将输出所有当前正在运行的进程。第一个将从该列表中grep
删除该进程。grep
第二个将提取firefox
过滤列表中的任何进程。
这可能是获取firefox
进程的进程 ID (PID) 的部分尝试,可能只是为了查看它是否正在运行,或者终止它。
如果是这种情况,我强烈建议您使用pgrep
(或者pkill
,如果您要终止进程):
if pgrep firefox 2>/dev/null; then
echo "firefox is already running"
else
echo "starting firefox..."
firefox &
done
终止firefox
:
pkill firefox
那是,不首先要绕很远的路找到它的PID。
pgrep
另请参阅pkill
您的系统的手册。
答案3
分析ps aux | grep -v grep | grep firefox
ps aux
会给你进程的输出。第一个 grep( ) 将删除将包含该单词grep -v grep
的任何行。之后,将再次对输出进行 grep ( ) 查找该单词并给出输出。ps aux
grep
grep firefox
firefox