Nesse caso em particular, acho que você pode simplesmente usar o shutdown. comando com sudo e os argumentos apropriados para agendar a suspensão em um horário específico.
Qual é a tarefa que você precisa executar e por que exatamente 4 horas dormem?
Thorbjørn Ravn Andersen
Respostas:
46
Use sudopara iniciar um shell raiz onde você executa os comandos:
sudo bash -c 'sleep 4h; command'
Todo comando em execução no shell raiz é executado com permissões de root, o que sleepnão prejudica. Se você precisar executar um comando com permissões de usuário, use sudo -u USERNAME COMMAND, por exemplo:
$ sudo bash -c 'sleep 4h; sudo -u dessert whoami; whoami'
dessert # whoami run as user dessert
root # whoami run as root
Sim, até a ferramenta certa para este trabalho, porque também cuida do redirecionamento de E / S, não bloqueia uma janela do shell e funciona mesmo quando o usuário se desconecta ou a máquina foi reiniciada desde então.
Simon Richter
4
@ SimonRichter: sudo bash -c 'sleep 4h && command' &colocar o sudo em segundo plano é uma maneira mais fácil de não bloquear uma janela / guia do shell. Se você deseja que a saída apareça de forma assíncrona como um lembrete de que aconteceu, isso é mais fácil. Ele não funciona durante as reinicializações, mas, dependendo das nohupconfigurações, ele pode continuar em execução após sair / sair do shell.
Peter Cordes
4
Observe que ato comando é executado assim que é possível quando o sistema é suspenso no horário especificado, veja aqui em U&L - dependendo do (s) comando (s) para executar, pode não ser o que você deseja.
dessert
2
Apenas uma sugestão, você também pode usar o systemctl para verificar o status do serviço em vez de chamar diretamente esse script init.d. Embora ambos aparentemente tenham o mesmo resultado, acho que a maneira moderna de interagir com os serviços systemd deve ser a preferida:systemctl status atd
Byte Commander
15
Uma maneira é executar através de um shellscript com sudopermissões (e forneça a senha, quando você iniciar o shellscript), se o shellscript estiver no diretório atual,
sudo ./delayer 4h
onde delayerpode haver um shellscript com o conteúdo
#!/bin/bash
sleep "$1"
command
Torne executável com
chmod +x delayer
e copie ou mova-o para um diretório, PATHse desejar.
Se você deseja um shellscript mais flexível, onde você pode selecionar a [linha] de comando para atrasar digitando o (s) parâmetro (s), pode tentar
Bem, se for uma /bin/shsintaxe, tudo ficará bem. Mas se você pretende usar recursos específicos do bash, o shebang é necessário. Eu e a Steeldriver discutimos sobre isso em algum lugar. Aaand Videonauth excluiu seu comentário antes que eu pudesse responder corretamente. Oh bem
Sergiy Kolodyazhnyy 18/02
@SergiyKolodyazhnyy, Você está certo. Portanto, neste caso, o shebang está lá para tornar o shellscript robusto no caso de recursos adicionais em que a sintaxe possa ser diferente.
sudodus 18/02
@SergiyKolodyazhnyy Bem, foi apenas uma sugestão, então pensei que deixar o comentário não era necessário e só aumentaria a confusão. Sinta-se à vontade para entrar em contato comigo no chat e mostrar sua opinião :)
Videonauth
2
Outra maneira seria iniciar a sessão interativa sudo com sudo -s(não altera o diretório) ou sudo -i(altera o diretório atual para o diretório inicial raiz) e, em seguida, insira seus comandos (sem o sudo)
shutdown
. comando com sudo e os argumentos apropriados para agendar a suspensão em um horário específico.Respostas:
Use
sudo
para iniciar um shell raiz onde você executa os comandos:Todo comando em execução no shell raiz é executado com permissões de root, o que
sleep
não prejudica. Se você precisar executar um comando com permissões de usuário, usesudo -u USERNAME COMMAND
, por exemplo:Outra abordagem seria usar
sudo visudo
para permitir a execução do comando sem acesso root, consulte: Como permitir a execução sem solicitar a senha usando o sudo?Observe que, dependendo do comando, isso pode criar uma falha de segurança.
fonte
Supondo que você queira executar o processo apenas uma vez (não, por exemplo, a cada 4 horas), poderá usar
atd
/etc/init.d/atd status
ou melhor aindasystemctl status atd
)Em um terminal como root, execute seu comando da seguinte maneira:
Se você deseja executá-lo a cada 4 horas, você também pode usar o cron (como root) com a seguinte configuração no seu crontab
fonte
at
é a ferramenta certa para este trabalho, porque também cuida do redirecionamento de E / S, não bloqueia uma janela do shell e funciona mesmo quando o usuário se desconecta ou a máquina foi reiniciada desde então.sudo bash -c 'sleep 4h && command' &
colocar o sudo em segundo plano é uma maneira mais fácil de não bloquear uma janela / guia do shell. Se você deseja que a saída apareça de forma assíncrona como um lembrete de que aconteceu, isso é mais fácil. Ele não funciona durante as reinicializações, mas, dependendo dasnohup
configurações, ele pode continuar em execução após sair / sair do shell.at
o comando é executado assim que é possível quando o sistema é suspenso no horário especificado, veja aqui em U&L - dependendo do (s) comando (s) para executar, pode não ser o que você deseja.systemctl status atd
Uma maneira é executar através de um shellscript com
sudo
permissões (e forneça a senha, quando você iniciar o shellscript), se o shellscript estiver no diretório atual,onde
delayer
pode haver um shellscript com o conteúdoTorne executável com
e copie ou mova-o para um diretório,
PATH
se desejar.Se você deseja um shellscript mais flexível, onde você pode selecionar a [linha] de comando para atrasar digitando o (s) parâmetro (s), pode tentar
Exemplo de demonstração (pequeno atraso, 5s, para fins de demonstração),
fonte
/bin/sh
sintaxe, tudo ficará bem. Mas se você pretende usar recursos específicos do bash, o shebang é necessário. Eu e a Steeldriver discutimos sobre isso em algum lugar. Aaand Videonauth excluiu seu comentário antes que eu pudesse responder corretamente. Oh bemOutra maneira seria iniciar a sessão interativa sudo com
sudo -s
(não altera o diretório) ousudo -i
(altera o diretório atual para o diretório inicial raiz) e, em seguida, insira seus comandos (sem o sudo)fonte