我正在寻找一个策略建议。我对 Linux shell 脚本非常陌生。刚学 tcsh 不到一个月。我需要一个脚本来自动检测结果文件何时从远程服务器复制回远程计算机中的文件夹,然后启动 scp 将文件返回到我的工作站。我事先不知道作业何时完成运行,因此文件夹可能很长时间没有结果文件。我也不知道最后一个结果文件何时从远程服务器复制回文件夹(从而可以启动 scp)。
我曾尝试过 crontab。当我猜对的时候,它工作得很好,但大多数时候都很令人失望。所以我尝试自己编写一个脚本,现在我有了它。我打算编写一个也可以为我和我的同事服务的脚本。要使用该脚本,用户首先需要手动登录到远程计算机。然后在远程计算机上执行该脚本。该脚本首先要求用户输入他们的本地计算机名称和他们希望保存结果文件的目录。然后脚本将循环测试文件总数何时发生变化。当它检测到这一点时,这意味着第一个结果文件开始从远程服务器复制回来,然后它再次循环以检测文件夹中的文件总大小何时停止变化,这意味着最后一个结果文件已完成复制到文件夹。之后,它执行 scp 将所有结果文件发送到用户工作站最初指定的目录。
脚本运行良好,但我希望让脚本能够在后台运行,即使用户从远程计算机注销并关闭终端,它仍可自行运行。我还希望让用户只需在终端中输入一个简单的命令即可启动脚本,就像一个简单的
./script.tcsh
我尝试通过命令运行脚本
./script.tcsh &
但失败了,因为后台进程无法接受用户输入。
Google 后,找到了 disown 这个命令,但找不到这个命令。显然远程机器和我的机器都不支持这个命令。
尝试修改脚本,首先接受用户输入,然后尝试使用
cat > temp_script.tcsh << EOF
{rest of my script}
EOF
然后一行
./temp_script.tcsh &
尝试创建另一个脚本文件并使用第一个脚本在后台启动第二个脚本。同样失败,因为 cat 不将 $variable 视为文字文本,而是用值替换它。我有一个 foreach i(1 2) 循环,cat 命令只是不断报告错误(变量 i 的值缺失,它只是 foreach 循环语法中的一个计数器)。
我现在没有主意。有人能告诉我一些我可以自己尝试的策略吗?目标是只使用 1 个脚本文件,并提示用户输入 2 个输入(机器名称和要保存的目录),然后不再与用户交互或等待,即使关闭终端也能运行。
注意:我不需要密码即可登录远程机器并返回。