como agendar adequadamente uma tarefa que agenda uma tarefa com 'at' (atd)? ou como citar / escapar corretamente no bash

1

Eu estou procurando uma maneira de criar uma linha de comando usando 'at' (atd) para agendar uma tarefa, que agenda uma tarefa para fazer "mais coisas" após uma reinicialização (uma tarefa por vez). O que estou procurando agora é uma maneira de fazê-lo voar apenas encadeando "em" horários.

O meu problema é que, de alguma forma, me perco com a citação / escape no bash.

o que eu tenho até agora e o que funciona em uma execução manual é:

echo "somecommand -someOptions 2>&1 | mail -s \"$HOST after reboot: somecommand -someOptions\" [email protected]" | at now +5 minutes ;\
#do admin stuff before reboot in less than 5 mins here ;\
touch /fastboot ; reboot

como mencionado, isso funciona bem. Agora gostaria de encapsular a coisa toda em OUTRO novo comando 'AT', para que a linha de comando anterior possa ser programada para uma hora de início específica e não exija mais uma execução manual.

Eu assumo que deve ser possível encapsular / incluir a coisa toda em outro comando "at", então eu gostaria de descobrir como citar / escapar corretamente para que funcione.

Eu tentei isso (não funciona):

echo "echo \"somecommand -someOptions 2>&1 | mail -s \"$HOST after reboot: somecommand -someOptions\" [email protected]\" | at now +5 minutes ;\
#do admin stuff before reboot in less than 5 mins here ;\
touch /fastboot ; reboot ; " | at now + 1 minute

Eu vejo que ele agenda 2 trabalhos, faz o material do administrador antes de reinicializar e reinicia, mas o segundo (mais tarde) no trabalho é embaralhado / travado por causa de algumas citações / escapamentos ruins, eu acho. Eu gostaria de saber e aprender mais sobre o que está acontecendo aqui e onde eu errei na fuga. Eu acho que eu poderia usar aspas simples no exterior em, já que neste caso eu não preciso de nenhuma expansão de variável, mas vamos supor que eu gostaria de usar a expansão de variáveis lá também. Nesse caso, como devo escapar / citar isso corretamente?

    
por Axel Werner 06.12.2016 / 17:35

2 respostas

3

Você esqueceu de inverter as aspas duplas quando escreveu \" , que deve ser \\" . Mas você pode evitar isso usando um terceiro tipo de cotação shell, o aqui-documento:

at now + 1 minute <<\!
echo "somecommand -someOptions 2>&1 | mail -s \"$HOST after reboot: somecommand -someOptions\" [email protected]" | at now +5 minutes
#do admin stuff before reboot in less than 5 mins here
touch /fastboot ; reboot
!
    
por 06.12.2016 / 22:44
1

Quebra o que você quer fazer em um script ( bash , perl , ...). Depure o script. Diga at para executar o script .:

at now + 5
/home/user/bin/doit
^D
    
por 17.12.2016 / 17:17