Acontece que a solução é mais fácil do que eu pensava:
ssh root@remoteserver 'TMP_FILE=$(mktemp --tmpdir backup.XXXXXXXXXX.log) && ((/root/backup.sh && echo DONE_$TMP_FILE) </dev/null > $TMP_FILE 2>&1 &) && echo $TMP_FILE'
Gostaria de iniciar um script de longa duração via SSH e retornar imediatamente. Depois, quero verificar o host remoto a cada 5 minutos para ver se o trabalho está concluído.
Para realizar a primeira parte, usei esse truque :
ssh root@remoteserver 'TMP_FILE=$(mktemp --tmpdir backup.XXXXXXXXXX.log) && (/root/backup.sh </dev/null > $TMP_FILE 2>&1 &) && echo $TMP_FILE'
Agora, para a segunda parte, como o backup.sh pode ser qualquer script, eu gostaria de acrescentar algo como DONE_$TMP_FILE
ao arquivo apontado por $TMP_FILE
quando o backup.sh terminar e, a cada 5 minutos, execute este comando:
ssh root@remoteserver 'tail -1 $TMP_FILE'
para ver se a última linha é igual a DONE_$TMP_FILE
.
O problema é que não consigo me separar de um comando composto:
ssh root@remoteserver 'TMP_FILE=$(mktemp --tmpdir backup.XXXXXXXXXX.log) && (/root/backup.sh </dev/null > $TMP_FILE 2>&1 && echo DONE_$TMP_FILE >> $TMP_FILE &) && echo $TMP_FILE'
O comando acima irá simplesmente bloquear até que backup.sh
termine de ser executado.
Existe alguma maneira de se desconectar de uma sequência de comandos sem colocá-los em um shell script?
Se houver uma maneira melhor de fazer isso, eu adoraria ouvir isso. Idealmente, não preciso criar nenhum script de shell auxiliar.
Acontece que a solução é mais fácil do que eu pensava:
ssh root@remoteserver 'TMP_FILE=$(mktemp --tmpdir backup.XXXXXXXXXX.log) && ((/root/backup.sh && echo DONE_$TMP_FILE) </dev/null > $TMP_FILE 2>&1 &) && echo $TMP_FILE'
Tags ssh bash io-redirection