为什么ps输出与shell脚本不同

时间:2014-03-11 08:37:12

标签: bash shell

我试图做一个简单的检查,看看VLC播放器是否正在运行:

if [ `ps -ef | grep vlc | wc -l` -gt 1 ]

如果我从shell发出这个命令,它在运行1时返回2是grep的进程,另一个是VLC的进程。如果它没有运行,那么它返回1(greps进程)。

但是,如果我尝试从shell脚本执行此操作,则如果它不运行则返回3,如果不运行则返回4.

有人可以请解释这里发生了什么。有更优雅的方式吗?

2 个答案:

答案 0 :(得分:1)

  

如果我从shell发出此命令,它在运行1时返回2   如果它没有运行则返回1(greps进程)。   但是,如果我尝试从shell脚本执行此操作,则如果它不运行则返回3,如果不运行则返回4.

那是因为您获得了包含vlc字的evey流程。

所以你想要更新你的脚本是:

if [ `ps -ef | grep -v grep | grep -v "$0"| grep vlc | wc -l` -gt 1 ]

因为grep -v删除了参数字符串,所以它会删除grep进程和"$0"进程。

答案 1 :(得分:0)

当你运行一个shell命令时,它本身就是一个内部有“vlc”的新进程。 当您在shell脚本中运行它时,您还有另外两个进程:shell脚本和其中的命令。 试试这个(在脚本中)来查看所有进程:

ps -ef | grep vlc