bash - obtenha o pid para um script usando o nome do arquivo de script

5

Eu tenho dois scripts:

  • running_script
  • script_one

Eu preciso obter o PID para / todas as instâncias de running_script em execução sob um nome de usuário e, em seguida, pkill para interromper os processos running_script e filha.

Esperávamos algo como:

ps -fu will | grep running_script

para encontrar o processo running_script (es). No entanto, a verificação do PID em relação à saída do comando ps mostra que o cmd é: "bin / bash" para o processo running_script .

running_script é executado como um processo separado ( & operator) que inicia script_one . Eu imprimo os PID-s no início para comparar com a saída do comando ps .

running_script  &
echo $! -- $BASHPID

No caso de uso real, não teremos PIDs para alguns processos running_script em execução. Além disso, script_one pode ou não ser um processo separado da running_script parent.

Para os fins do exercício, script_one apenas faz loops.

while [ true ]
do
    echo "  $0 - 35sec ..."
    sleep 35
done

No entanto, esse é apenas o exemplo. O requisito é obter o PID para o pai, running_script process (es).

Existe uma opção em ps ou outro comando que possa me dar o nome do arquivo de script e do PID? Ou um método para definir um nome que pode ser pesquisado?

No caso de uso final, pode haver várias instâncias de running_script , então selecioná-las pelo nome parece ser a melhor opção até o momento.

exemplo

Pensei que poderia ajudar a mostrar o que o comando ps mostra, já que a maioria das respostas parece pensar que isso funcionará. Eu corri este exemplo há pouco tempo.

$  ./running_script &
$  echo $! - $BASHPID
9047 - 3261
$  ps -ef | grep will

  UID     PID  PPID  C STIME TTY          TIME CMD
  will   8862  2823  0 22:48 ?        00:00:01 gnome-terminal
  will   8868  8862  0 22:48 ?        00:00:00 gnome-pty-helper
  will   8869  8862  0 22:48 pts/4    00:00:00 bash
* will   9047  3261  0 22:55 pts/2    00:00:00 /bin/bash
  will   9049  9047  0 22:55 pts/2    00:00:00 /bin/bash
  will   9059  2886  0 22:56 pts/0    00:00:00 man pgrep
  will   9070  9059  0 22:56 pts/0    00:00:00 pager -s
  will  10228  9049  0 23:31 pts/2    00:00:00 sleep 35
  will  10232  8869  0 23:31 pts/4    00:00:00 ps -ef
  will  10233  8869  0 23:31 pts/4    00:00:00 grep --colour=auto william

Eu marquei PID # 9047, é simplesmente mostra:   - vai 9047 3261 0 22:55 pts / 2 00:00:00 / bin / bash

Existe algo como um atributo " jobname " que eu poderia definir no linux?

    
por will 22.10.2015 / 14:36

3 respostas

7

Tente pgrep -f running_script - a opção -f usa a linha de comando inteira para corresponder, não apenas o nome do processo

    
por 22.10.2015 / 14:51
2

ps -o pid,args -C bash | awk '/running_script/ { print $1 }'

Isso usa ps para obter o pid e args para todos os processos bash e, em seguida, usa o awk para imprimir o pid (campo 1) do processo correspondente.

BTW, ps -o pid,args -C bash fornece o pid e o nome do arquivo de script que você solicitou - o nome do script está nos argumentos do comando bash .

Se você usar ps em vez de pgrep , use pelo menos seus recursos completos, em vez de usar a construção ps ... | grep -v grep | grep | awk extraordinariamente feia. O último grep não é necessário, pois awk pode realizar a correspondência de padrões. Na verdade, nenhum dos greps é necessário, pois o awk pode fazer tudo: ps ax | awk '! /awk/ && /myprocessname/ { print $1}'

    
por 22.10.2015 / 15:29
1
ps - ef | grep -v grep | grep <script_name> | awk '{print $2}'

O comando acima dará o PID para o script_name. Além disso, você pode fazer com que o script grave um arquivo temporário com seu PID em execução.

Adicione uma linha dentro do script: echo $$>/tmp/script_pid.tmp

    
por 22.10.2015 / 14:52