进程名称被 /usr/bin/python 和 /bin/su “屏蔽”

进程名称被 /usr/bin/python 和 /bin/su “屏蔽”

我正在尝试使用该pidof命令来查看我的脚本是否已在运行,因为如果脚本尚未运行,我只需要此可执行文件,但是,该pidof命令似乎没有返回PID使用输出中显示的名称的脚本的名称ps -ef。相反,它将此名称屏蔽为/usr/bin/python/bin/su。有人可以阐明正在发生的事情以及我如何运行pidof 'script.py -v'以查看脚本是否正在运行吗?

[root@cloud proc]# pidof python /some/dir/script.py -v
> pidof: invalid options on command line!

[root@cloud proc]# pidof "python /some/dir/script.py -v"
>

[root@cloud proc]# pidof "su - user -c python /some/dir/script.py -v"
> 

[root@cloud proc]# ps -ef | grep script.py
> root      5409 31739  0 13:07 pts/1    00:00:00 su - user -c python /some/dir/script.py -v
> user      5414  5409 96 13:07 ?        01:00:40 python /some/dir/script.py -v

[root@cloud proc]# ls -l /proc/5409/exe
> lrwxrwxrwx. 1 root root 0 Oct 13 14:04 /proc/5409/exe -> /bin/su

[root@cloud proc]# ls -l /proc/5414/exe
> lrwxrwxrwx. 1 user user 0 Oct 13 14:04 /proc/5414/exe -> /usr/bin/python

[root@cloud proc]# pidof /bin/su
> 31715 6308 5409

[root@cloud proc]# pidof /usr/bin/python
> 5414

答案1

pidof不提供指定/path/to/script匹配形式的命令的方法interpretername /path/to/script。它总是看着可执行文件的文件名文件中列出/proc/pid/stat

但如果你的脚本以舍邦 #!如果您使用 调用脚本/path/to/script

作为替代方案,大多数 GNU/Linux 系统都提供一个pgrep命令,它可以匹配整个或部分命令行。在您的示例中,您可以使用

pgrep -x -f 'python /some/dir/script.py -v'

这将匹配确切的命令行。如果你想匹配部分命令行,你可以这样做

pgrep -x -f 'python /some/dir/script.py .*'

您可以省略在模式的开头和结尾-x放置隐式,但这也将与您的过程相匹配。.*su - user -c python /some/dir/script.py -v

正如您在评论中提到的,确保命令不会同时运行多个实例的更好方法是使用文件锁定,例如fcntl.flock

相关内容