我从今天早上的某个时候开始编写实际的.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
从终端窗口运行得很好。
我做错了什么?
答案 0 :(得分:5)
grep
来电有两个错误。该模式不应包含换行符。要查找完整的字符串,请使用grep -F 'substring'
或grep -xF 'exact whole line'
。ps | grep
一起运行是非常脆弱的。在大多数unices(至少是Solaris,Linux和* BSD)上,使用pgrep:pgrep -f 'PATTERN'
如果正在运行的进程的命令行匹配PATTERN
,则返回true。
$(…)
表示在括号内运行命令并捕获其输出。因此,只要shell命中rsync
变量的定义,就会执行RUNSYNC
。要存储一个shell代码块,请使用一个函数(下面的示例,尽管您实际上并不需要这里的函数,但您可以直接编写代码)。[ $APPCHK < 2 ]
应为[ $APPCHK -lt 2 ]
:<
表示输入重定向。 (在bash中,您也可以编写[[ foo < bar ]]
,但这是字符串比较,而不是数字比较。)~/
是可选的。此外,-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
作为你的旗帜。目录创建是一种原子活动(文件创建不是),这将消除您在监视器的两个副本同时创建标记文件时可能遇到的任何错误。只有一个进程可以成功或删除一个标志目录。
我希望这会有所帮助。