Veja se um script está sendo executado ao usar #! / usr / bin / env

2

Eu tentei migrar o shebang para meus scripts bash de #!/bin/bash para #!/usr/bin/env bash , e alguns deles foram quebrados porque eles confiaram nesse código que verifica as instâncias existentes de si mesmos em execução e que funciona apenas com #!/bin/bash :

$ pidof -x myscript -o %PPID

O que eu gostaria de saber é como verificar com segurança se um script chamado por env está em execução, uma vez que a maioria das soluções que tentei envolverá uma regex suja e o stilll não será confiável:

$ pgrep -f '(^|/)myscript(\s|$)'

Considerando que o caminho para o meu script é /home/user/myscript , o código acima pode retornar o PID para os seguintes comandos indesejados:

editor /home/user/myscript
bash /tmp/myscript
bash /home/user/myscript with spaces
    
por Teresa e Junior 30.12.2015 / 09:44

1 resposta

2

No Linux, você pode usar pgrep para obter PIDs de prováveis suspeitos e inspecionar o primeiro argumento desses PIDs (disponível em /proc/$PID/cmdline ). /proc/$PID/cmdline tem todos os argumentos (incluindo o argumento 0) do processo, separados por ASCII NUL ( sed ).

Algo como:

pgrep bash | xargs -I {} sed -nz '2{p; q}' /proc/{}/cmdline | grep -Fqzx "$0"

Isso pressupõe as linhas separadas por nulo grep e sed . O cmdline imprime a segunda linha dos respectivos arquivos grep (argumento 1), que seria o nome do script. sed procura correspondências exatas do nome do seu script. Você poderia fazer a correspondência inteira em %code% , mas não estou com vontade de fazer malabarismos com citações.

Isso falhará se você chamar seu script por caminhos diferentes:

/home/user/myscript
cd /home; usr/myscript
myscript

No entanto, deve ser seguro contra espaços em branco em nomes de scripts.

    
por 30.12.2015 / 12:36