função bash que envia e-mail após o término do job

1

Eu escrevi a seguinte função no meu bashrc. Ele verifica se um trabalho está sendo executado a cada 5 segundos e envia um e-mail quando o trabalho é concluído.

function jobcheck () {
  time='date'
  jobstatus='jobs $1'
  while [ 1 ]; do
  if (( ! 'echo $jobstatus | grep "Running" | wc -l' )); then
    "sendEmail command to send email"
    break;
  fi
  sleep 5;
  done
}

Eu quero chamar essa função como abaixo (para o trabalho número 2, por exemplo)

jobcheck 2

e continue a executar outros comandos na linha de comando. Mas o loop while continua sendo executado e eu não recebo o prompt de comando.

Se eu executar como

jobcheck 2 &

Então dá erro que bash: jobs 2 not found

Como executo essa função em segundo plano?

    
por user13107 16.03.2017 / 04:11

1 resposta

3

Você terá que reescrever sua função para poder fazer isso.

Quando você inicia um trabalho em segundo plano com & , o shell realmente acompanha isso e, na verdade, é possível descobrir mais informações usando o jobs builtin. No entanto, essa informação é específica para essa instância do shell; se você executar sua função com & , então um shell separado é gerado, que não é o shell com os jobs em segundo plano, e, portanto, não é possível acessar as informações sobre os jobs do shell original a partir desse shell separado.

No entanto, há uma maneira simples de corrigir isso:

  • reescreva sua função para que ela seja executada em termos de IDs de processo (PIDs) em vez de números de trabalho. Ou seja, verifique se ainda existe um processo (por exemplo, analisando ps output, verificando se /proc/pid existe)
  • execute sua nova função com %2 em vez de 2 como argumento. Ou seja, dê o sinal de porcentagem seguido pelo ID do trabalho que você deseja monitorar; o sinal de porcentagem é usado por shells Bourne para substituir um id de job pelo pid do job especificado.

Com isso, deve funcionar.

    
por 16.03.2017 / 08:19