通过每分钟轮询来复制远程目录中的修改文件

时间:2018-04-11 07:52:04

标签: linux bash sftp scp

我必须每分钟轮询远程服务器并复制文件,如果文件是从上次修改的话。我不能使用&rs; rsync'。所以我遵循的方法是每分钟轮询服务器,将文件放在临时目录中,如果它被修改,则将其复制到实际目录。以下是该代码。

while true
do
  scp -pq ${SFTP_USER}@${SFTP_SERVER}:${SFTP_PATH}/${FILE_NAME} ${PUT_TEMP_SFTP_PATH} 2>/dev/null
  mododTime=$(date +%s -r ${PUT_TEMP_SFTP_PATH}/${FILE_NAME})
  if [[ "${mododTime}" -gt "${lastModTime}" ]]
  then
    cp -p ${PUT_TEMP_SFTP_PATH}/${FILE_NAME} ${PUT_ACTUAL_SFTP_PATH}/${FILE_NAME}
    lastModTime=$mododTime
    echo "Copying modified file"
  fi
  sleep 1
done

我想在两个方面提供帮助:

1.在我的方法中,我每次都要复制文件以获得修改后的时间戳。我可以在没有实际复制的情况下获得该时间戳吗?

2.我想知道如何通过某些操作从外部杀死脚本(比如另一个bash脚本,即我的杀戮工作),比如ps后跟grep(我面临的一个问题是ps显示进程名称为bash ,所以我无法确切地确定这个过程。

1 个答案:

答案 0 :(得分:2)

无需复制。您使用的是scp,因此您显然可以使用sshssh将命令作为参数在远程主机上执行。因此,您只需stat远程计算机上ssh上的文件,并在本地与 mod时间进行比较,例如

if [ $(ssh host "stat -c %Y /path/to/remote/file") -gt $(stat -c %Y /localfile) ]
then
    scp "your remote file"
fi

如果您已为远程主机建立了公钥/私钥无密码登录,则会有所帮助。如果没有,有很多可用的方法。