Tente pgrep -f running_script
- a opção -f usa a linha de comando inteira para corresponder, não apenas o nome do processo
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.
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?
Tente pgrep -f running_script
- a opção -f usa a linha de comando inteira para corresponder, não apenas o nome do processo
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}'
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
Tags process scripting shell-script