Enviando jobs não interativos por ssh [duplicate]

0

Eu tenho acesso remoto SSH a uma máquina que gostaria de usar para trabalhos de longa duração. O que eu faço atualmente é simplesmente

ssh user@remote command-to-run

Isso tem várias desvantagens:

  • Eu não posso simplesmente suspender minha máquina local - quando eu fizer isso, SIGHUP será enviado para o processo remoto, efetivamente matando-o. Eu poderia usar nohup para evitar isso.
  • A saída pode ser longa, prefiro que ela seja redirecionada para arquivos. Claro, eu posso fazer isso manualmente, mas fica desajeitado com uma série de comandos.
  • O processo pode durar muito tempo. Seria ideal que o programa de envio apenas confirmasse que o comando (script) foi submetido com sucesso e terminado.
  • Eu gostaria de receber uma notificação por e-mail quando o processo terminar, com seu código de saída. Claro, eu poderia usar um script de shell e um comando de terminal para enviá-lo manualmente, mais um hack.
  • Eu quero agendar vários scripts de uma só vez com segurança. Em particular, quero poder enviar vários scripts com o mesmo nome sem renomear manualmente. Eu não quero me preocupar com possíveis arquivos que já existem no sistema de arquivos.

Isso é muito semelhante ao que o SLURM faz, mas não tenho direitos administrativos no lado remoto. Além disso, quando tenho acesso a todos os núcleos da máquina remota, não faz sentido declarar quantos núcleos eu preciso.

Existe algo que eu possa usar para isso? O que eu descrevi parece um uso comum.

    
por marmistrz 20.01.2017 / 18:21

1 resposta

0

Se você puder colocar scripts que executam esses trabalhos de longa duração para você na máquina remota, isso se torna muito fácil:

#!/bin/bash
# This script will run a long-running-job (if it's not already running)
# and email when it completes.
lockfile=/var/run/long-job-1.lock
logfile=$(mktemp)
errfile=$(mktemp)
if [[ -f "$lockfile" ]]; then
    echo "This job is already running." 1>&2
    exit 1
else
    echo $$ > "$lockfile"
    trap 'rm -f "$lockfile" "$logfile" "$errfile"' EXIT
fi

/path/to/some/really/longrunning/job.sh
returncode=$?

if [[ 0 -ne "$returncode" ]]; then
    cat "$errfile" | mailx -s "Job failed with exit code $returncode" -a "$logfile" [email protected]
else
    cat "$logfile" | mailx -s "Job succeeded" [email protected]
fi

Coloque esse script no servidor remoto em seu diretório inicial como longjob1.sh . Então, localmente, você pode:

ssh username@remotehost "screen -dmS LongJob1 ./longjob1.sh"

O script (e a tarefa que ele invoca) será executado em uma sessão screen no servidor remoto e o enviará por e-mail quando isso for feito. Se sair com erro, você receberá um email com o log de erros, com o log padrão anexado ao email.

    
por 20.01.2017 / 18:40