bash脚本+ rsync:bash不会同步到主机?

时间:2011-05-20 18:47:41

标签: bash scripting ssh rsync

我从今天早上的某个时候开始编写实际的.sh脚本,而且我有点卡住了。我正在尝试编写一个脚本来检查进程是否正在运行,如果不是则启动它。 (我打算使用cron每10到15分钟运行一次此脚本。)

这是我到目前为止所拥有的:

#!/bin/bash

APPCHK=$(ps aux | grep -c "/usr/bin/rsync -rvz -e ssh /home/e-smith/files/ibays/drive-i/files/Warehouse\ Pics/organized_pics  imgserv@192.168.0.140:~/webapps/pavlick_container/public/images
")

RUNSYNC=$(rsync -rvz -e ssh /home/e-smith/files/ibays/drive-i/files/Warehouse\ Pics/organized_pics  imgserv@192.168.0.140:~/webapps/pavlick_container/public/images)

if [ $APPCHK < '2' ];
  then
    $RUNSYNC
fi

exit

这是我得到的错误:

$ ./image_sync.sh 
rsync: mkdir "/home/i/webapps/pavlick_container/public/images" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(595) [Receiver=3.0.7]
rsync: connection unexpectedly closed (9 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [sender=3.0.7]
./image_sync.sh: line 8: 2: No such file or directory

TRTWF就是那个

rsync -rvz -e ssh /home/e-smith/files/ibays/drive-i/files/Warehouse\ Pics/organized_pics imgserv@192.168.0.140:~/webapps/pavlick_container/public/images

从终端窗口运行得很好。

我做错了什么?

5 个答案:

答案 0 :(得分:5)

  • 您的grep来电有两个错误。该模式不应包含换行符。要查找完整的字符串,请使用grep -F 'substring'grep -xF 'exact whole line'
  • 查找进程是否与ps | grep一起运行是非常脆弱的。在大多数unices(至少是Solaris,Linux和* BSD)上,使用pgreppgrep -f 'PATTERN'如果正在运行的进程的命令行匹配PATTERN,则返回true。
    • 每个程序返回一个状态代码,0表示成功或1到255之间的数字表示失败。在shell中,任何命令都是有效的布尔表达式;状态代码0被视为true,其他任何东西都被视为false。
  • $(…)表示在括号内运行命令并捕获其输出。因此,只要shell命中rsync变量的定义,就会执行RUNSYNC。要存储一个shell代码块,请使用一个函数(下面的示例,尽管您实际上并不需要这里的函数,但您可以直接编写代码)。
  • 您的测试[ $APPCHK < 2 ]应为[ $APPCHK -lt 2 ]<表示输入重定向。 (在bash中,您也可以编写[[ foo < bar ]],但这是字符串比较,而不是数字比较。)
  • 远程rsync路径开头的
  • ~/是可选的。此外,-e ssh是默认值,除非您的rsync版本真的很旧。
  • 脚本末尾的
  • exit无用,无论如何脚本都会退出。

这是一个考虑到上述内容的脚本:

#!/bin/bash
 run_rsync () {
     rsync -rvz '/home/e-smith/files/ibays/drive-i/files/Warehouse Pics/organized_pics' \
           imgserv@192.168.0.140:webapps/pavlick_container/public/images
}
process_pattern='/usr/bin/rsync -rvz /home/e-smith/files/ibays/drive-i/files/Warehouse Pics/organized_pics imgserv@192\.168\.0\.140:webapps/pavlick_container/public/images'
if pgrep -xF "$process_pattern"; then
  run_rsync
fi

答案 1 :(得分:1)

使用rsync命令看起来这条路径上的某个目录是错误的:〜/ webapps / pavlick_container / public / images

您是否已检查过imgserv主目录中的服务器192.168.0.140,看看是否存在“pavlick_container / public”?这是我的猜测。

答案 2 :(得分:1)

你有很多问题。首先,您运行命令而不是将命令放在变量中。还有一种更简单的方法。

RUNSYNC="rsync -rvz -e ssh /home/e-smith/files/ibays/drive-i/files/Warehouse\ Pics/organized_pics  imgserv@192.168.0.140:~/webapps/pavlick_container/public/images"
if ! pgrep -f "rsync.*organized_pics"; then $RUNSYNC; fi

答案 3 :(得分:0)

首先,检查程序是否正在运行的方式大多是错误的。这可能有效,也可能无效。您应该依赖脚本启动时创建的某个特殊文件,并在脚本结束时将其删除。这将告诉您脚本是否正在运行,只是检查该文件是否存在。

然后,尝试在\之前添加~或完全删除~/。如果cron作为其他用户运行,则代字号将在客户端中替换为用户目录。它适用于命令行,因为两台计算机上的用户的主目录可能匹配,但cron正在运行的用户不匹配。猜测一下,但是再次尝试删除~/并查看它是否有效。

答案 4 :(得分:0)

如果您的真实代码在grep目标上缺少关闭dlb-quote,那么您将从一开始就得到奇怪的结果。

此外,ps aux不会列出您所显示的完整命令行结果(至少在我使用的所有ps上)。

您需要将其设为ps auxwww。通常你会看到人们添加| grep -v grep |(你会在某些时候看到原因)。这可以简化为将“/ usr / bin / rsync”更改为“/ usr / bin / [r] sync”的静态搜索目标。

其他用户也在帮助他们发表评论。使用标记文件作为@DiegoSevilla提及略有弃用。使用mkdir /tmp/MyWatcher_flagDir作为你的旗帜。目录创建是一种原子活动(文件创建不是),这将消除您在监视器的两个副本同时创建标记文件时可能遇到的任何错误。只有一个进程可以成功或删除一个标志目录。

我希望这会有所帮助。