É possível ativar um processo que está em pausa usando o sleep
comando?
Como exemplo, digamos que você tenha este script:
#!/bin/bash
echo "I am tired"
sleep 8h
echo "I am fresh :)"
Após 30 minutos, você descobre que precisa que o script seja interrompido, ou seja, desejava ter escrito sleep 30m
.
Você não deseja ligar kill PID
ou pressionar Ctrl+ C, pois o último comando não será executado e você permanecerá cansado.
Existe uma maneira de ativar o processo sleep
ou talvez usar outro comando que suporte a ativação? Soluções para processos em segundo plano e em primeiro plano são bem-vindas.
command-line
bash
Bittenus
fonte
fonte
gawk
ing realmente não funciona. A última vez que tive umsleep
processo,pushd
tirei da cama.#!
linha. E isso importa, porque a resposta à sua pergunta depende da existência de alguma-e
na#!
fila.#!/bin/bash -e
, o script será interrompido após um erro. Simplesmente matar o comando sleep será tratado como um erro pelo bash. Isso significa que sem-e
uma resposta bastante simples para sua pergunta. Se-e
foi usado, torna-se muito mais difícil, porque você precisaria interromper o processo de sono sem matá-lo.Respostas:
Quando um script Bash está executando um
sleep
, aqui está apstree
aparência:Ambos têm IDs de processo (PIDs), mesmo quando executados como um script. Se quiséssemos interromper o sono, enviaríamos
kill 8506
e a sessão do Bash seria retomada ... O problema está em um ambiente com script que não conhecemos o PID dosleep
comando e não há um humano para analisar o processo árvore.Podemos obter o PID da sessão do Bash através da
$$
variável mágica. Se pudermos armazenar isso em algum lugar, podemos direcionar instânciassleep
que estão sendo executadas sob esse PID. Aqui está o que eu colocaria no script:E então podemos dizer
pkill
parasleep
instâncias nucleares em execução sob esse PID:Novamente, isso está se limitando apenas aos
sleep
processos em execução diretamente nessa única sessão do Bash. Contanto que o PID tenha sido registrado corretamente, isso o torna muito mais seguro quekillall sleep
oupkill sleep
, o que poderia causar um nulo em qualquersleep
processo do sistema (permissões permitidas).Podemos provar essa teoria com o exemplo a seguir, onde temos três sessões de bash separadas, duas em execução
sleep
. Somente porque estamos especificando o PID da sessão do bash do canto superior esquerdo, apenas elesleep
é eliminado.Uma abordagem alternativa é colocar
sleep
em segundo plano, armazenar seu PID e devolvê-lo ao primeiro plano. No script:E para matá-lo:
fonte
Você pode escrever seu script para manipular ("interceptar") outros sinais de kill etc., para modificar o comportamento dos scripts conforme necessário. Veja man bash:
fonte
Você poderia simplesmente matar o sono, o que continuaria na próxima linha do script:
Observe que isso mataria qualquer processo de suspensão em execução no seu sistema, não apenas no seu script.
fonte
Eu tenho um script bash adormecido iniciado
cron
na inicialização. O script acorda a cada minuto e define o brilho da tela do laptop com base no nascer e no pôr do sol obtidos na Internet. Uma fase de transição configurável pelo usuário entre brilho total e escurecimento total requer intensificação e redução de valores em 3, 4, 5 ou o que for calculado a cada minuto.Oli tocou brevemente
pstree
em sua resposta, mas a rejeitou, porque mataria todas assleep
instâncias. Isso pode ser evitado restringindo a pesquisa usando as opções pstree.Usando
pstree -h
vemos toda a hierarquia:Como você pode ver, um login típico do Ubuntu contém muitos PIDs (Process IDs).
Podemos reduzi-lo ao nosso script em execução usando:
Nós vemos:
cron
iniciou um shell (ID do processo 1308 e ID da sessão 1308)sleep
sob o ID do processo 26552 e novamente o ID da sessão 1308Nesse ponto, podemos usar
pkill -s 1308
e isso mataria toda a sessão, que inclui o shell, nosso programadisplay-auto-brightness
e osleep
comando. Em vez disso, usaremoskill 26552
apenas para matar o comando de suspensão, forçando nosso programa a ativar e ajustar o brilho.Digitando isso manualmente no terminal, você vê:
O próximo passo é fazer isso quando o laptop acordar da suspensão. Por exemplo, quando a tampa foi fechada, estava totalmente escuro e o brilho da tela foi definido como "300". Quando a tampa é aberta, a luz do dia e o brilho precisam ser ajustados para "2000". É claro que o programa acordaria sozinho em 1 a 59 segundos, mas é mais confortável que o brilho seja definido instantaneamente.
Vou postar o código de suspensão / currículo depois que ele for escrito. Espero que este fim de semana.
fonte