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

eck*_*kza 3 ssh bash scripting rsync

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

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

#!/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
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

$ ./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
Run Code Online (Sandbox Code Playgroud)

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

从终端窗口运行得很好.

我究竟做错了什么?

Gil*_*il' 5

  • 你的grep电话有两个错误.该模式不应包含换行符.要查找完整的字符串,请使用grep -F 'substring'grep -xF 'exact whole line'.
  • 查找进程是否正在运行ps | grep是非常脆弱的.在大多数unices(至少是Solaris,Linux和*BSD)上,使用pgrep:pgrep -f 'PATTERN'如果有一个正在运行的进程与命令行匹配,则返回true PATTERN.
    • 每个程序都返回一个状态代码,0表示成功或1到255之间的数字表示失败.在shell中,任何命令都是有效的布尔表达式; 状态代码0被视为true,其他任何内容都被视为false.
  • $(…)表示在括号内运行命令并捕获其输出.所以,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
Run Code Online (Sandbox Code Playgroud)