通过 ssh 提交非交互式作业

通过 ssh 提交非交互式作业

我可以通过 SSH 远程访问一台我想用于长时间运行作业的机器。我目前所做的只是

ssh user@remote command-to-run

这有几个缺点:

  • 我不能简单地挂起我的本地计算机 - 当我这样做时,SIGHUP将被发送到远程进程,有效地杀死它。我可以使用 nohup 来防止这种情况。
  • 输出可能很长,我宁愿将其重定向到文件。当然,我可以手动完成,但是使用一系列命令会变得很笨拙。
  • 该过程可能会运行很长时间。理想的是,提交程序仅确认命令(脚本)已成功提交并终止。
  • 我想在进程终止时收到邮件通知及其退出代码。当然,我可以使用 shell 脚本和终端命令手动发送它,这又是一种技巧。
  • 我希望能够安全地同时安排多个脚本。特别是,我希望能够推送具有相同名称的多个脚本,而无需手动重命名。我不想担心文件系统上已经存在的可能文件。

这与 SLURM 所做的非常相似,但我在远程端没有任何管理权限。此外,当我可以访问远程计算机的所有核心时,声明我需要多少个核心是没有意义的。

有什么我可以用的吗?我所描述的似乎是一个常见的用例。

答案1

如果您可以将为您运行这些长时间运行的作业的脚本放在远程计算机上,这将变得非常容易:

#!/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

将该脚本放在远程服务器的主目录中,格式为longjob1.sh.然后,在本地,您可以:

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

该脚本(及其调用的作业)将在screen远程服务器上的会话中运行,并在完成后向您发送电子邮件。如果错误退出,您将通过电子邮件收到错误日志,并附有标准日志。

相关内容