AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 472718
Accepted
jmhostalet
jmhostalet
Asked: 2018-10-03 02:10:59 +0800 CST2018-10-03 02:10:59 +0800 CST 2018-10-03 02:10:59 +0800 CST

Como faço para desligar um servidor Linux após 60 minutos de execução?

  • 772

Tenho um servidor que normalmente está desligado por questões de segurança. Quando quero trabalhar nele, ligo-o, 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 a maneira correta porque o cron não leva em consideração quando o servidor foi ligado pela última vez. Eu só posso definir padrões periódicos, mas eles não levam esses dados em consideração.

Como eu poderia fazer essa implementação?

shutdown cron
  • 10 10 respostas
  • 13604 Views

10 respostas

  • Voted
  1. sebasth
    2018-10-03T02:19:46+08:002018-10-03T02:19:46+08:00

    Existem várias opções.

    • Fornecer tempo diretamente para shutdown -P:

      shutdown -P +60
      

      Observe que a shutdown página man também aponta:

      Se o argumento de tempo for usado, 5 minutos antes de o sistema cair, o arquivo /run/nologin será criado para garantir que novos logins não sejam permitidos.

    • Use ato comando.

    • Crie um arquivo de unidade systemd ou script de inicialização que seja executado shutdown -P 60na inicialização.

    • Use o cron @rebootpara executar o comando após a inicialização.

      Adicionar ao crontab (raiz):

      @reboot shutdown -P +60
      

    Para os dois últimos métodos, você também pode usar sleep 3600 && shutdown -P nowem vez de usar o argumento time shutdownpara atrasar o desligamento por 60 minutos. Dessa forma, os logins são possíveis até o último momento antes do desligamento.

    • 69
  2. Lie Ryan
    2018-10-03T07:24:16+08:002018-10-03T07:24:16+08:00

    Isso parece um problema XY .

    Minhas tarefas geralmente não levam mais de 15 minutos. Gostaria de implementar um mecanismo para desligá-lo automaticamente após 60 minutos.

    Se você desligar após 60 minutos, corre o risco de estar com um problema particularmente complicado e só precisar de mais tempo. Muitas das soluções anteriores não facilitariam o atraso do desligamento.

    Se a tarefa não for uma tarefa interativa, mas sim uma tarefa com script que é acionada automaticamente de outra máquina, @sdkks deu 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 fazer a detecção de inatividade.

    Se você fizer sua tarefa em uma GUI (X11), poderá detectar as sessões de GUI ociosas usando a abordagem descrita aqui: Execute um comando quando o sistema estiver ocioso e quando estiver ativo novamente

    Se você fizer a tarefa por meio de um terminal, poderá detectar usuários logados usando o whocomando. Você pode configurar um cronjob que desliga a máquina se whoretornar um resultado vazio. Observe que esta 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 também as sessões de terminal ociosas, poderá combinar a abordagem anterior com a desconexão automática de sessões SSH ociosas ClientAliveInterval e ClientAliveCountMax. 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 pelo wcomando.

    • 32
  3. Best Answer
    Dirk Krijgsman
    2018-10-03T02:21:16+08:002018-10-03T02:21:16+08:00

    Se você executar suas tarefas como o mesmo usuário todas as vezes, basta adicionar o comando shutdown, opcionalmente com a opção -P, ao seu perfil. O número representa a quantidade de minutos que o comando de desligamento está atrasado. Certifique-se de que seu usuário tenha a capacidade de executar o comando de desligamento via sudo sem uma senha.

    echo "sudo shutdown -P +60" >> ~/.profile
    

    Adicionado:

    Depois de ler a maioria das outras respostas, adoro a opção de adicionar "@reboot /<path to script/command>" no cron (raiz). Resposta dada por sebasth como sua quarta opção. Você pode adicionar o comando shutdown ou escrever um pequeno script que execute o shutdown e execute-o via cron. O WoJ também tem uma ótima solução se você usar o systemd.

    • 22
  4. user80158
    2018-10-03T04:25:33+08:002018-10-03T04:25:33+08:00

    Embora as respostas anteriores aqui satisfaçam o requisito com perfeição, você também pode desligar sua máquina assim que as tarefas forem concluídas.

    bashscripts podem ser trapped, o que significa que certos sinais podem ser interceptados e certas tarefas podem ser executadas quando necessário. EXITé um dos sinais que podem ser capturados.

    Você seria capaz de:

    1. Defina um trapfor EXITde seus scripts de shell automatizados, significando o encerramento de suas tarefas automatizadas
    2. Defina um trappara o seu .bashrc EXIT, ou seja, sempre que você sair dessa máquina, desligue-a.

    A opção nº 1 seria o caso ideal, desde que suas tarefas não exijam inspeção ad hoc e julgamento manual.

    A opção nº 2 cobriria os casos em que você esqueceria de sair do terminal sem desligar. Há uma ressalva; se você tiver vários terminais para a mesma máquina abertos e sair de um deles, ele ainda desligará a máquina da mesma forma. (Pode ser roteirizado para evitar isso, mas não vou complicar a solução.)

    cleanup(){
        # Do some tasks before terminating
        echo oh la la, cleaning is so nice
        echo "See you later, world"
        sudo poweroff & # finally shutdown
    }
    trap cleanup EXIT
    

    Isso pode estar no final da .bashrcopção #2, em algum lugar no topo do seu script para a opção #1.

    Por que não usar poweroffno final do script?

    Eu prefiro usar set -eo pipefailat no topo dos meus scripts. Se ocorrer algum erro, ele não falhará silenciosamente; ele irá parar de executar mais comandos. trapde EXITsinal deve abranger 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 bashmodelo simples que uso para facilitar a depuração de scripts; talvez possa ser de alguma utilidade. Por favor, veja esta essência .

    • 8
  5. Criggie
    2018-10-03T17:57:48+08:002018-10-03T17:57:48+08:00

    O seguinte é executado commandcom parâmetros e, se for concluído com êxito, desligará a caixa imediatamente, supondo que o usuário possa executar poweroff. Pode ser necessário usar sudo poweroff.

    command --parameters && poweroff
    

    Enquanto o seguinte simplesmente é executado poweroffimediatamente quando o comando termina:

    command --parameters ; poweroff
    

    Se você acha que o comando precisa de tempo de descanso após a conclusão, execute

    command --parameters ; sleep 3600 ; poweroff
    

    Se você acha que o comando pode ser executado horas extras, pode restringi-lo a uma hora:

    timeout 1h command --parameters ; poweroff
    

    timeoutfaz parte do coreutilspacote, então você provavelmente já o tem.

    • 5
  6. Daniele Santi
    2018-10-03T02:20:30+08:002018-10-03T02:20:30+08:00

    Elaborando o comentário @dirkt, você pode inserir um atcomando no seu .bashrcou em .profilequalquer arquivo que seu shell use no login para agendar um desligamento automático 60 minutos após o login.

    Algo como:

    at now + 60 minutes -f /sbin/halt
    
    • 4
  7. gogators
    2018-10-03T09:14:33+08:002018-10-03T09:14:33+08:00

    Se você estiver realmente preocupado com a segurança, use um temporizador de saída mecânico na fonte de alimentação. Basta configurá-lo para qualquer hora que você deseja desligar. Dessa forma, ninguém pode fazer login remotamente e desativar o desligamento. Você precisaria de acesso físico.

    • 3
  8. Saveriofr
    2018-10-03T02:46:09+08:002018-10-03T02:46:09+08:00

    Tente colocar o script ( sudo shutdown -P 3600) no /etc/init.ddiretório para executá-lo automaticamente na inicialização.

    Ou tente usar anacron, adicionando o comando no /etc/anacrontabarquivo. Também sugiro usar nohupna frente do comando para ter certeza de que o comando ainda está funcionando após o logout.

    • 1
  9. WoJ
    2018-10-05T02:37:13+08:002018-10-05T02:37:13+08:00

    Se você estiver em uma systemdmáquina, você pode usar um timer monotônico

    A unidade do temporizador/etc/systemd/system/shutdown_after_an_hour.timer

    [Unit]
    Description=shutdown after an hour
    
    [Timer]
    OnBootSec=1h
    
    [Install]
    WantedBy=timers.target
    

    A unidade do temporizador /etc/systemd/system/shutdown_after_an_hour.service:

    [Unit]
    Description=shutdown after an hour
    
    [Service]
    ExecStart=/sbin/poweroff --force --no-wall
    Type=oneshot
    

    É habilitado através

    # systemctl enable shutdown_after_an_hour.timer
    

    Seu status (particularmente quanto tempo resta antes do desligamento) está disponível via

    # systemctl list-timers shutdown_after_an_hour.timer
    

    Ele funcionará na próxima reinicialização, não é útil systemctl startdurante a sessão quando é criado, pois não funcionará (porque não foi acionado durante a reinicialização) ou desligará a máquina imediatamente se passar de uma hora. Não sei qual vai acontecer de fato, nunca testei esse caso específico.

    • 1
  10. CodeGnome
    2018-10-05T07:19:21+08:002018-10-05T07:19:21+08:00

    Aproveite o arquivo de logout do seu Shell

    Se você precisar do servidor apenas para tarefas interativas ou não interativas iniciadas por seu UID, considere colocar seus comandos de desligamento em seu arquivo ~/.bash_logout . O Manual GNU Bash diz:

    Quando um shell de login interativo é encerrado ou um shell de login não interativo executa o comando interno exit, o Bash lê e executa comandos do arquivo ~/.bash_logout, se existir.

    Portanto, adicionar "sudo poweroff" ou semelhante ao seu arquivo de logout desligaria o servidor assim que você sair da sua sessão atual ou quando uma sessão Bash não interativa chamar exit. Você também pode optar por usar em ou passar um atraso de tempo para o desligamento se preferir adiar o desligamento.

    Para uma abordagem mais interativa para isso, você pode colocar os seguintes Bashisms em seu arquivo de logout:

    # Shutdown unless N or n is pressed within 30 seconds.
    shopt -s nocasematch
    read -t 30 -N 1 -p 'Shutdown now? (Y/n) '
    [[ "$REPLY" =~ n ]] || sudo poweroff
    

    Ressalvas

    Existem algumas advertências que você deve ter em mente sobre esta solução:

    • Isso provavelmente funcionará mesmo em um terminal iniciado pelo X Windows, mas provavelmente não funcionaria para uma sessão X11 que não foi iniciada por startxou similar.
    • Se você tiver scripts não interativos que chamem exit, poderão ocorrer desligamentos inesperados.
    • Seu arquivo sudoers pode solicitar uma senha se você não tiver especificado NOPASSWDos comandos de desligamento ou se não tiver chamado sudo -vantes de executar o comando de desligamento.
    • Provavelmente há outros casos extremos nos quais ainda não pensei.

    Em resumo, você pode querer considerar se essa abordagem atende à sua necessidade real 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 vai variar.

    • 1

relate perguntas

  • Como o anacron funciona se não é um daemon?

  • Tarefas do cron não funcionando como esperado

  • Cron */6 horas mas com offset?

  • Como recuperar crontab excluído

  • Auto-SSH funciona manualmente, mas não em segundo plano

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve