Obtenha PID do script do host no bash

1

Eu tenho um script ( run.sh ) que chama meu script de aplicativo. Em determinado momento, posso ter vários run.sh em execução.

O formato geral do script run.sh é

#!/bin/bash
# Running DALTON JOB: Helix
dir=$(pwd)
    echo "-----------------------------------------------"
   export DALTON_TMPDIR=/mnt/raid0/scratch
    export OMP_NUM_THREADS=6
    source /opt/intel/compilers_and_libraries_2017.0.098/linux/bin/compilervars.sh intel64
    source /opt/intel/mkl/bin/mklvars.sh intel64
    echo "//-------process started----------------------------//"

./application.sh  -mb 14550 input.mol output.out

echo "//-------process finished----------------------------//"

É possível obter o PID do application.sh dentro do script run.sh . (Achei que $$ fornece o PID do próprio script.)

Além disso, notei que o PID do aplicativo é sempre maior numericamente do que o script pai, mas talvez sua coincidência.

    
por ankit7540 08.06.2017 / 16:12

3 respostas

5

Se você quiser ver o PID de application.sh enquanto estiver em execução, sugiro colocá-lo explicitamente em segundo plano, capturando o PID e esperando que ele saia:

# ...
./application.sh  -mb 14550 input.mol output.out &
app_pid=$!
echo "The application pid is: $app_pid"
wait "$app_pid"
# ...
    
por 08.06.2017 / 16:46
4

Eu acredito que você pode querer uma combinação de algo como pstree -p e ps axjf com alguma análise adicional.

Observe como o PID de httpd é 30469 , e todo processo que é filho de httpd tem PPID (ID de processo pai) de 30469 . Os netos de httpd terão o PPID de seu processo pai, que terá o PPID do processo httpd .

Eu não postei a saída completa de nenhum deles, pois são bastante grandes. Aqui está um exemplo de saída de cada um:

user@host$ ps -axjf
PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
1     30469 30469 30469 ?           -1 Ss       0   0:46 /usr/sbin/httpd
30469 22410 22410 22410 ?           -1 Ssl      0   0:00  \_ PassengerWatchdog
22410 22413 22413 22410 ?           -1 Sl       0  23:06  |   \_ PassengerHelperAgent
22410 22418 22418 22410 ?           -1 Sl      99   0:01  |   \_ PassengerLoggingAgent
30469 22442 30469 30469 ?           -1 Sl      48   7:55  \_ (wsgi:pulp)
30469 22443 30469 30469 ?           -1 S       48   1:48  \_ /usr/sbin/httpd
30469 22445 30469 30469 ?           -1 S       48   1:55  \_ /usr/sbin/httpd
30469 22447 30469 30469 ?           -1 S       48   1:54  \_ /usr/sbin/httpd

user@host$ pstree -p
 ├─httpd(30469)─┬─PassengerWatchd(22410)─┬─PassengerHelper(22413)─┬─{PassengerHelpe}(22415)
        │              │                        │                        ├─{PassengerHelpe}(22416)
        │              │                        │                        ├─{PassengerHelpe}(22417)
        │              │                        │                        ├─{PassengerHelpe}(22420)
        │              │                        │                        ├─{PassengerHelpe}(22422)
        │              │                        │                        ├─{PassengerHelpe}(22423)
        │              │                        │                        ├─{PassengerHelpe}(29342)

Se você conhece a árvore de processos pai, pode executar pstree -p <pid> .

    
por 08.06.2017 / 16:45
1

Para salvar o ID do processo de um utilitário, inicie-o como um processo assíncrono e salve seu PID em uma variável ou use $! diretamente (é o PID do processo em segundo plano iniciado mais recentemente):

#!/bin/bash

export DALTON_TMPDIR=/mnt/raid0/scratch
export OMP_NUM_THREADS=6
source /opt/intel/compilers_and_libraries_2017.0.098/linux/bin/compilervars.sh intel64
source /opt/intel/mkl/bin/mklvars.sh intel64

printf 'Started at "%s"\n' "$(date)"

SECONDS=0
./application.sh -mb 14550 input.mol output.out &

app_pid="$!"

printf 'Application PID is %d\n' "$app_pid"

wait "$app_pid"

printf 'Ended at "%s"\n' "$(date)"
printf 'Run time was approximately %d minutes (%d seconds)\n' "$(( SECONDS/60 ))" "$SECONDS"

O PID da aplicação é $app_pid .

Você diz que percebeu que os PIDs de novos processos são sempre maiores que os dos processos anteriores. Isso não é nada em que você possa confiar por dois motivos:

  1. Haverá uma quebra de alocação de PID quando o PID máximo permitido tiver sido alocado para um processo e os PIDs antigos começarem a ser reutilizados. O próximo PID será menor, não maior, que o PID anterior quando a quebra automática ocorrer (e os novos PIDs depois disso irão pular números que ainda estão em uso como PIDs executando processos).
  2. Alguns sistemas, como o OpenBSD, usam alocação aleatória de PIDs:

    $ for i in {1..5}; do bash -c 'echo $$'; done
    49915
    2152
    61168
    87739
    95187
    

Como observação, você pode usar $PWD em vez de $(pwd) para obter o diretório de trabalho atual.

    
por 10.06.2017 / 08:40