Obtendo o pid do script bash de si mesmo

4

Eu tenho um script com muitas coisas chamadas script.sh :

#!/bin/bash
#It
#Is
#Doing
#Things

Existe uma maneira de conseguir o processo de script e depois matá-lo após 5 minutos?

Como:

#!/bin/bash
#Now here give pid of script.sh then kill it after 5 minutes
#It
#Is
#Doing
#Things

atualizar

Imagin Eu tenho este script:

#!/bin/bash
while :
do
      echo "line printed"
done

Se usarmos essas respostas, isso não mostrará a saída ...

Eu quero colocar colocar ser impresso e depois de 5 minutos cntrl + c sinal mata o processo de bash ...

Esta é uma boa ideia?

PID=$$
kill -SIGINT $PID

Onde deve ser colocado?

    
por MLSC 18.05.2014 / 15:41

5 respostas

2

Se você quiser sempre que o script expire após 5 minutos, basta usar um bloco em um processo em segundo plano como este. Se você usar Ctrl+C enquanto estiver em execução, o processo em segundo plano também será encerrado:

#!/bin/bash
{
    sleep 5m
    kill $$
} &

while true
do
    date
    sleep 1
done
    
por 19.05.2014 / 14:47
14

Você obtém o PID com PID=$$ .

O que você deseja pode ser mais facilmente alcançado com o comando timeout .

Mas você também pode executar um processo em segundo plano:

(sleep $TIMEOUT && kill "$PID") &
    
por 18.05.2014 / 15:46
13

O utilitário timeout que faz parte do GNU coreutils faz isso por você:

timeout 5m bash script.sh

terminaria o script após 5 minutos de execução.

    
por 18.05.2014 / 15:47
5

Você pode alterar seu loop para:

#!/bin/bash -
while ((SECONDS < 5*60))
do
  echo "line printed"
done

Ou insira ((SECONDS < 5*60)) || exit em seu loop mais profundo.

SECONDS em ksh , zsh e bash é uma variável especial que contém o número de segundos desde o início do shell.

    
por 19.05.2014 / 11:52
4

Você pode usar uma condição de verificação:

#!/bin/bash

START=$(date +%s)

while [[ $(($(date +%s) - $START)) -ne 300 ]]
do
    #do something here
done

echo QUIT

Explicação

  • date +%s obtém o tempo em segundos desde epoch, nós o salvamos na variável START , marca a hora de início do script.
  • [[ $(($(date +%s) - $START)) -ne 300 ]] : obtemos o tempo atual ( date +%s novamente) subtrai para a hora de início (que é salva na variável START ).
  • Se o resultado não for igual a 300 (5 minutos), o script continuará em execução,
  • Se o resultado for igual a 300 , o que significa que o script executou 5 minutes desde a hora de início, encerramos o loop while , o script termina.
por 18.05.2014 / 20:48