capture o id do processo que chamou a função dentro da função

1

Eu quero registrar o ID do processo que chamou uma função específica no shell script do Korn.

Por exemplo, vamos considerar uma função de autoload definida pelo usuário SQUARE. Agora, se um script TestSquare.sh chamar a função SQUARE. Eu quero capturar o id do processo do TestSquare.sh em execução e a hora de início do processo TestSquare.sh.

Eu não quero passar nenhum parâmetro para a função. Eu quero construir todas as informações usando apenas o id do processo do script de chamada.

    
por Krishna 20.02.2015 / 04:56

1 resposta

3

O ID do processo do shell está disponível no parâmetro especial $$ (no manual do ksh, isso está documentado na seção “Expansão de parâmetros”).

log () {
  printf "script=%s pid=%d message=%s\n" "$0" "$$" "$1"
}

Observe que $$ é o ID do processo do script. Se você executar código em um subshell (ou seja, entre parênteses, dentro de uma substituição de comando, no lado esquerdo de um pipe, etc.), isso não altera o valor de $$ . Se você quiser que o ID do processo que realmente emitiu a mensagem de log, você pode obtê-lo chamando um subprocesso e informando-o para relatar seu ID de processo pai. (Algumas shells têm uma variável para isso, mas acho que não ATT ksh.)

log () {
  printf "script=%s script_pid=%d emitting_pid=%d message=%s\n" \
         "$0" "$$" "$(sh -c 'echo $PPID')" "$1"
}

Se você quiser registrar a hora de início do script, a maneira mais fácil seria atribuir a hora atual a uma variável quando o script fosse iniciado.

#!/bin/ksh
start_time=$(date)

Se você precisar obter o horário de início do script mais tarde, poderá obtê-lo com ps -o stime , mas isso não fornece a data e a hora completas. Como alternativa, você pode calcular a partir da variável SECONDS (que sempre contém o número de segundos desde que o script foi iniciado) e a data atual. Se você estiver usando o ksh, você provavelmente não possui o GNU date, o que deixa você sem ferramentas convenientes para cálculos de datas. O Awk fornece uma maneira indireta de obter o número de segundos desde a época , de modo que os snippets a seguir definem start_time como o script tempo de início em segundos desde a época:

start_time=$(export SECONDS; awk 'BEGIN {srand(); print srand() - ENVIRON["SECONDS"]; exit}')
    
por 21.02.2015 / 01:54