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}')