Eu tenho um servidor que normalmente está desligado por razões de segurança. Quando quero trabalhar nele, eu o ligo, executo minhas tarefas e o desligo novamente. Minhas tarefas geralmente não levam mais de 15 minutos. Gostaria de implementar um mecanismo para desligá-lo automaticamente após 60 minutos.
Eu pesquisei como fazer isso com o cron, mas não acho que seja o caminho correto, porque o cron não leva em consideração quando o servidor foi ativado pela última vez. Só posso definir padrões periódicos, mas eles não levam esses dados em consideração.
Como eu poderia fazer essa implementação?
at
(execução única).sudo shutdown -h +60
que iniciaria um contador de 60 minutos para o processo de desligamento (-halt). Se você queria cancelá-lo, você poderiasudo shutdown -c
(isso não utilizar cron embora)Respostas:
Se você executar suas tarefas como o mesmo usuário sempre, poderá simplesmente adicionar o comando shutdown, opcionalmente com a opção -P, ao seu perfil. O número representa a quantidade de minutos em que o comando shutdown está atrasado. Verifique se o usuário tem a capacidade de executar o comando shutdown via sudo sem uma senha.
fonte
shutdown -k -P 3600
vsshutdown -k -P 60
(-k
mensagem de impressões parede, mas não tem outro efeito)Existem várias opções.
Forneça tempo diretamente para
shutdown -P
:Observe que a
shutdown
página do manual também aponta:Use o
at
comandoCrie um arquivo de unidade systemd ou um script init que seja executado
shutdown -P 60
na inicialização.Use cron
@reboot
para executar o comando após a inicialização.Adicione ao crontab (raiz):
Para os dois últimos métodos, você também pode usar o
sleep 3600 && shutdown -P now
argumento time parashutdown
não atrasar o desligamento por 60 minutos. Dessa forma, os logins são possíveis até o último momento antes da emissão do desligamento.fonte
sleep
comando, você ainda precisa especificar um tempo parashutdown
- nós queremos usarnow
esse argumento se já tivermos feito a espera (mas observe que você não receberá muitos avisos para salvar seu trabalho antes dele) desaparece debaixo de você!).shutdown -P 60
funcione, não é assim que o comando deve ser chamado. De acordo com a página do manual, você deve usarshutdown -P +60
. --- O desligamento também sem um argumento de tempo (no exemplosleep 3600 && shutdown -P
) será atrasado em um minuto (comoshutdown -P +1
). Como Toby Speight escreveu, você provavelmente gostaria de usarshutdown -P now
.Isso parece um problema XY .
Se você desligar após 60 minutos, corre o risco de estar executando um problema particularmente complicado e precisar de mais tempo. Muitas das soluções anteriores não facilitariam o atraso do desligamento.
Se a tarefa não é interativa, mas sim uma tarefa com script que é automaticamente acionada de outra máquina, o @sdkks ofereceu uma ótima solução para isso; você realmente deve apenas encarregar a máquina de executar o desligamento assim que o script e todas as suas tarefas terminarem.
No entanto, se sua tarefa for interativa, sugiro que faça a detecção de inatividade.
Se você executar sua tarefa em uma GUI (X11), poderá detectar as sessões da GUI inativa usando a abordagem descrita aqui: Execute um comando quando o sistema estiver inativo e quando estiver ativo novamente
Se você executar a tarefa através de um terminal, poderá detectar usuários conectados usando o
who
comando Você pode configurar um cronjob que desligue a máquina sewho
retornar um resultado vazio. Observe que essa será uma abordagem bastante conservadora; ele não desligará o sistema se você deixar o console conectado, mas ocioso.Se você quiser ser um pouco mais agressivo e desconectar sessões de terminal ociosas, bem, você pode combinar a abordagem anterior com desligar automaticamente sessões SSH ociosos
ClientAliveInterval
eClientAliveCountMax
. Outra abordagem para isso, se você não tiver SSH, mas tiver uma sessão de terminal local, é usar o tempo ocioso do terminal, conforme retornado pelow
comando.fonte
Embora todas as respostas anteriores aqui atendam aos requisitos de perfeição, você também pode desligar a máquina assim que as tarefas forem concluídas.
bash
Os scripts podem sertrap
ped, o que significa que certos sinais podem ser interceptados e determinadas tarefas podem ser executadas quando necessário.EXIT
é um dos sinais que podem ser capturados.Você seria capaz de:
trap
paraEXIT
seus scripts de shell automatizados, significando o encerramento de suas tarefas automatizadastrap
para o seu.bashrc
EXIT
, ou seja, sempre que você sair dessa máquina, desligue-a.A opção 1 seria o caso ideal, desde que suas tarefas não exijam inspeção adhoc e julgamento manual.
A opção 2 abrangeria os casos em que você esqueceria de sair do terminal sem desligar. Há uma ressalva; se você tiver vários terminais na mesma máquina abertos e sair de um deles, ele ainda desligará a máquina da mesma forma. (Ele pode ser script para evitar isso, mas não vou complicar a solução.)
Isso pode estar no final da
.bashrc
opção 2, em algum lugar na parte superior do seu script para a opção 1.Por que não usar
poweroff
no final do script?Eu prefiro usar
set -eo pipefail
no topo dos meus scripts. Se ocorrer algum erro, ele não falhará silenciosamente; parará de executar mais comandos.trap
OEXIT
sinal deve cobrir os casos em que o script termina prematuramente devido a erros.No entanto, para suas tarefas, isso também pode significar que a máquina será desligada antes de serem concluídas.
Eu tenho um
bash
modelo simples que eu uso para facilitar a depuração de scripts; talvez possa ser de alguma utilidade. Por favor, veja esta essência .fonte
.bashrc
eu preferiria a parte inferior, caso outra coisa a substituísse. Sua preocupação não parece clara. Você pode compartilhar um trecho de exemplo em repl.it, talvez?Elaborando sobre comentário @dirkt, você pode inserir um
at
comando em seu.bashrc
ou.profile
ou qualquer arquivo de seus usos do escudo em Login para agendar um desligamento automático 60 minutos após o seu login.Algo como:
fonte
at
beco. Você também pode ver asat
tarefas em/var/spool/
at
neste contexto porque ele sobrevive às reinicializações. Se o OP fizesse logon, desligasse manualmente e depois novamente no espaço de uma hora, ele seria iniciado antes de passar uma hora após o último login, quando o primeiro processo de desligamento programado.O seguinte é executado
command
com parâmetros e, se for concluído com êxito, a caixa será desativada imediatamente, supondo que o usuário possa executarpoweroff
. Pode ser necessário usarsudo poweroff
.Considerando que o seguinte simplesmente roda
poweroff
imediatamente quando o comando termina:Se você acha que o comando precisa de tempo de descanso após a conclusão, execute
Se você acha que o comando pode executar horas extras, pode restringi-lo a uma hora:
timeout
faz parte docoreutils
pacote, então você provavelmente já o possui.fonte
Se você está realmente preocupado com a segurança, use um timer de tomada mecânica na fonte de alimentação. Basta configurá-lo para a hora que você deseja que seja desligado. Dessa forma, ninguém pode fazer login remotamente e desativar o desligamento. Você precisaria de acesso físico.
fonte
Se você estiver em uma
systemd
máquina, poderá usar um timer monotônicoA unidade do temporizador
/etc/systemd/system/shutdown_after_an_hour.timer
A unidade do temporizador
/etc/systemd/system/shutdown_after_an_hour.service
:É ativado via
Seu status (particularmente quanto tempo resta antes do desligamento) está disponível via
Ele funcionará na próxima reinicialização; não será útil
systemctl start
durante a sessão em que for criado, pois não funcionará (porque não foi acionado durante a reinicialização) ou desligará a máquina imediatamente após uma hora. Na verdade, não sei qual vai acontecer, nunca testei esse caso específico.fonte
Tente colocar o script (
sudo shutdown -P 3600
) no/etc/init.d
diretório para executá-lo automaticamente na inicialização.Ou tente usar
anacron
, adicionando o comando no/etc/anacrontab
arquivo Também sugiro usarnohup
na frente do comando para garantir que o comando ainda esteja funcionando após o logout.fonte
Aproveite o arquivo de logout do seu shell
Se você precisar apenas do servidor para tarefas interativas ou não interativas iniciadas pelo seu UID, considere colocar seus comandos de desligamento no arquivo ~ / .bash_logout . O Manual do GNU Bash diz:
Portanto, adicionar "sudo poweroff" ou semelhante ao seu arquivo de logout desligaria o servidor assim que você sair da sessão atual ou quando uma sessão Bash não interativa chamar
exit
. Você também pode optar por usar a ou passar um tempo de atraso para o desligamento se você prefere adiar o desligamento.Para uma abordagem mais interativa, você pode colocar os seguintes Bashisms em seu arquivo de logout:
Ressalvas
Há algumas advertências que você deve ter em mente sobre esta solução:
startx
ou similar.exit
, poderá ocorrer encerramentos que não esperava.NOPASSWD
os comandos shutdown ou se não ligousudo -v
antes de executar o comando shutdown.Em resumo, convém considerar se essa abordagem atende às suas necessidades reais ou se uma abordagem completamente diferente, como monitorar a ausência de usuários conectados ou alguma outra alternativa, é uma aposta melhor. Sua milhagem definitivamente varia.
fonte