我正在尝试使用该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。