Procura pelo script de execução PID pelo nome do script

0

Eu tenho o seguinte script

hello.sh
--------
while :
do
    echo "hello"
    sleep 20
done

E quando eu executei o script acima, recebi 2627 como o PID do script

root@localhost ~]# ./hello.sh &
[1] 2627
[root@localhost ~]#

Agora, quando estou executando o comando ps em outro terminal, não estou recebendo o nome do script na saída

[root@localhost ~]# ps -ef| grep 262[7]
root      2627  1582  0 19:19 pts/1    00:00:00 -bash
root      3427  2627  0 19:52 pts/1    00:00:00 sleep 20
[root@localhost ~]#

$$ é o PID do shell principal no qual estou executando o script. Eu sei que dentro do script eu posso colocar $$ para obter o PID do script, mas essa não é minha intenção aqui.

Uma vez que executei o script de execução longa em segundo plano e suponho que eu tenha fechado o terminal acidentalmente, existe uma maneira de fazer o PID usar o nome do script ou qualquer outro meio?

FYI

[root@localhost ~]# echo $$
2586
[root@localhost ~]# ps -ef| grep 262[7]
root      2627  1582  0 19:19 pts/1    00:00:00 -bash
root      3657  2627  0 20:02 pts/1    00:00:00 sleep 20
[root@localhost ~]# ps -ef| grep bas[h]
root      1517  1513  0 18:43 pts/18   00:00:00 -bash
root      1582  1578  0 18:45 pts/1    00:00:00 -bash
root      2586  2581  0 19:18 pts/54   00:00:00 -bash
root      2627  1582  0 19:19 pts/1    00:00:00 -bash
[root@localhost ~]#

O 2586 é o PID do shell principal e dentro dele, eu executei o script hello.sh. Ele criou um novo shell e começou a executar os comandos dentro dele. Todos esses básicos eu sei. Esta não é uma questão duplicada. Por favor, veja a saída para entendê-lo.

    
por k_vishwanath 22.10.2018 / 16:24

2 respostas

4

Você deve adicionar uma linha she-bang apropriada ( #! /bin/sh ou #! /bin/bash ) ao seu script se quiser que ele apareça com o nome na lista de processos.

Exemplo:

$ cat foo
sleep 10

$ ./foo &
[4] 4403
$ ps -q 4403
  PID TTY          TIME CMD
 4403 pts/3    00:00:00 bash

$ cat bar
#! /bin/sh
sleep 10

$ ./bar &
[5] 4406
$ ps -q 4406
  PID TTY          TIME CMD
 4406 pts/3    00:00:00 bar

Caso contrário, no linux você ainda pode encontrar o nome do script no diretório /proc/PID/fd :

$ ./foo &
[2] 5125
$ ls -l /proc/5125/fd
total 0
lrwx------ 1 ahq ahq 64 Oct 22 17:57 0 -> /dev/pts/3
lrwx------ 1 ahq ahq 64 Oct 22 17:57 1 -> /dev/pts/3
lrwx------ 1 ahq ahq 64 Oct 22 17:57 2 -> /dev/pts/3
lr-x------ 1 ahq ahq 64 Oct 22 17:57 254 -> /tmp/foo
lrwx------ 1 ahq ahq 64 Oct 22 17:57 255 -> /dev/pts/3

Aviso para a próxima linha, o 254 fd que aponta para o caminho do script sendo executado. Com outros shells do que bash , serão outros fd , como 3 ou 10 .

Isso também pode ser pesquisado inversamente com lsof /tmp/foo .

    
por 22.10.2018 / 16:47
1

No Linux, você pode:

grep -l hello.sh /proc/*/task/*/comm 2>/dev/null

... que relataria qualquer um dos seus processos com "hello.sh" em sua linha de comando (pid 26560, quando eu executei):

/proc/26560/task/26560/comm

O redirecionamento do stderr é fazer cair a reclamação do grep sobre o arquivo de comunicação do seu processo atual (/ proc / self / task / $$ / comm) desaparecendo entre o momento em que o shell expande o caminho curinga e quando o grep decide abri-lo para leitura / grepping.

Se você executar um segundo "hello.sh", receberá dois resultados, etc:

$ ./hello.sh &
[2] 28328
$ grep -l hello.sh /proc/*/task/*/comm 2>/dev/null
/proc/26560/task/26560/comm
/proc/28328/task/28328/comm
    
por 22.10.2018 / 16:41