Como verificar o processo junto com seus argumentos na lista de processos?

3

Eu escrevi um script onde eu preciso passar vários argumentos com o mesmo script, o script está sendo executado após um certo tempo usando o cron. Para garantir que não haja várias instâncias dos scripts em execução, fiz uma verificação para verificar se o processo do script está sendo executado usando ps -ef | grep -v grep | grep Connection_Manager.sh

Eu quero verificar quais argumentos estão sendo usados no processo de execução do script quando realizo uma verificação usando ps -ef . Como posso verificar os argumentos que estão sendo usados no processo de execução do script?

    
por Ankit Vashistha 25.12.2013 / 07:34

4 respostas

13

Com relação a verificar se o processo já está em execução, altero o que você está fazendo um pouco e use pgrep .

$ pgrep -f Connection_Manager.sh

Exemplo

$ pgrep -f Connection_Manager.sh
16293

A opção -f permite que pgrep corresponda a toda a linha de comando e não apenas à primeira parte.

Argumentos da linha de comando

Para isso, você tem alguns métodos. Você também pode tentar analisá-los a partir da saída de pgrep . Você precisará adicionar uma opção adicional, -a .

Exemplo

$ pgrep -af Conn
17306 /bin/bash ./Connection_Manager.sh arg1 arg2

Em seguida, use awk , sed ou algo semelhante para analisar sua saída.

sed

$ pgrep -af ./Conn | sed 's/.*Connection_Manager.sh //'
arg1 arg2

awk

$ pgrep -af ./Conn | tr '
$ ls /proc/19146 
attr        cmdline          environ  limits     mountinfo   numa_maps      personality  stack    task
autogroup   comm             exe      loginuid   mounts      oom_adj        root         stat     timers
auxv        coredump_filter  fd       map_files  mountstats  oom_score      sched        statm    wchan
cgroup      cpuset           fdinfo   maps       net         oom_score_adj  sessionid    status
clear_refs  cwd              io       mem        ns          pagemap        smaps        syscall
0' ' '| awk '{print $4, $5}' arg1 arg2

Estes 2 métodos estão fora de minha cabeça, eles poderiam, sem dúvida, ser simplificados.

Usando / proc /

Mas, dependendo do número de argumentos e do comprimento, isso pode causar problemas se a linha de comando for excessivamente longa. Então eu provavelmente vou com o segundo método e analiso o conteúdo do arquivo cmdline do processo. Todo processo tem um conjunto de arquivos dentro do sistema de arquivos do Linux ' /proc que contém meta informações sobre esse processo.

$ cat -v cmdline 
/bin/bash^@./Connection_Manager.sh^@arg1^@arg2^@

Um desses arquivos é o arquivo cmdline . Mas você tem que prestar atenção especial ao conteúdo deste arquivo. Os argumentos dentro deste arquivo são separados por caracteres NUL. Você pode usar cat -v <file> para vê-los em uma janela de terminal.

$ xargs -0 < cmdline 
/bin/bash ./Connection_Manager.sh arg1 arg2

Isto substitui ^@ no lugar do NUL.

Portanto, a análise do conteúdo pode ser feita de várias maneiras, um método é discutido na resposta do @ Joesph, usando xargs -0 ... . Outro está usando cat -v .

Exemplos

xargs

$ cat -v cmdline 
/bin/bash^@./Connection_Manager.sh^@arg1^@arg2^@

gato

$ cat -v cmdline | sed 's/\^@/ /g'

Você pode usar sed para limpar este segundo método.

$ pgrep -f Connection_Manager.sh

Referências

por 25.12.2013 / 16:51
2

Se você estiver em um sistema GNU / Linux com acesso a um sistema de arquivos proc , aqui está como eu faria:

already_running=0
for pid in $(pgrep Connection_Manager.sh);do
   if xargs -0 </proc/$pid/cmdline | grep -q ... ;then # match arguments here
       already_running=1
       break
   fi
done
if ! [ $already_running -eq 1 ];then
    # run Connection_Manager.sh here
fi
    
por 25.12.2013 / 12:20
1

Por que não simplesmente usar o bloqueio?

#!/bin/bash
if [[ -f /tmp/$0.lock ]]; then
    echo "$0 is locked."
    exit 1
else
    touch /tmp/$0.lock
    trap "rm -f /tmp/$0.lock" EXIT
fi
# The rest of the script
    
por 25.12.2013 / 07:44
1

Eu escrevi um script de bloqueio que já lida com isso, incluindo os problemas de segurança da propriedade do arquivo temporário. Funciona mesmo sob o busybox.

A versão atual está disponível no link

Ele verifica os argumentos corretamente usando / proc / * / cmdline e gerencia os arquivos de bloqueio obsoletos. É usado por algumas centenas de cronjobs espalhados pelo * .gentoo.org.

Exemplo de uso mostrando o funcionamento:

$ ( /usr/local/bin/pidlock  sleep 5 & ) ; sleep 0.1 ; /usr/local/bin/pidlock   sleep 5
Error! 'pidlock-sleep' is running already!

(O sono 0.1 está lá para começar a primeira vez.)

    
por 25.12.2013 / 09:50