我想通过 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'