Nome do processo 'mascarado' por / usr / bin / python e / bin / su

0

Estou tentando usar o comando pidof para ver meu script já em execução, pois só quero esse executável se o script ainda não estiver em execução, no entanto, parece que o comando pidof não está retornando o pid do script usando o nome que é exibido em ps -ef output. Em vez disso, ele está mascarando esse nome como /usr/bin/python ou /bin/su . Alguém pode esclarecer o que está acontecendo e como posso executar pidof 'script.py -v' para ver se o script está sendo executado ou não?

[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
    
por AK47 13.10.2016 / 15:21

1 resposta

3

pidof não oferece uma maneira de especificar /path/to/script para corresponder aos comandos do formulário interpretername /path/to/script . Ele sempre olha para o nome do arquivo do executável listado no arquivo /proc/pid/stat .

Mas funcionará se o seu script começar com shebang #! e se você invocar o script com /path/to/script .

Como alternativa, a maioria dos sistemas GNU / Linux oferece um comando pgrep , que pode corresponder a toda ou parte de uma linha de comando. No seu exemplo, você pode usar

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

Isto irá corresponder à linha de comando exata. Se você quiser combinar uma linha de comando parcial, você pode fazer algo como

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

Você pode omitir o -x para colocar um .* implícito no início e no final do padrão, mas isso também corresponderá ao seu processo su - user -c python /some/dir/script.py -v .

Como você mencionou nos comentários, a melhor maneira de garantir que seu comando não execute várias instâncias ao mesmo tempo é usar o bloqueio de arquivo, como fcntl.flock .

    
por 13.10.2016 / 18:16