通过 SSH 启动作业并从复合命令中分离

通过 SSH 启动作业并从复合命令中分离

我想通过 SSH 启动一个长时间运行的脚本并立即返回。之后,我想每 5 分钟检查一次远程主机,看看工作是否完成。

为了完成第一部分,我使用了这个伎俩:

ssh root@remoteserver 'TMP_FILE=$(mktemp --tmpdir backup.XXXXXXXXXX.log) && (/root/backup.sh </dev/null > $TMP_FILE 2>&1 &) && echo $TMP_FILE'

现在,对于第二部分,由于 backup.sh 可以是任何脚本,因此我想将类似内容附加DONE_$TMP_FILE到 backup.sh 终止时指向的文件中$TMP_FILE,并每 5 分钟运行此命令:

ssh root@remoteserver 'tail -1 $TMP_FILE'

查看最后一行是否等于DONE_$TMP_FILE

问题是我无法设法脱离复合命令:

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'

上面的命令将简单地阻塞,直到backup.sh运行完成。

有没有办法从一系列命令中分离出来,而不将它们放入包装器 shell 脚本中?

如果有更好的方法可以做到这一点,我很想听听。理想情况下,我不需要创建任何辅助 shell 脚本。

答案1

事实证明解决方案比我想象的要容易:

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'

相关内容