我有以下命令来显示对subversion存储库的更改
svn log -v -r{$(date +%Y-%m-%d)}:HEAD http://therepository | awk '/^r[0-9]+ / {user=$3} {if (user=="username") {print $1 $2 $3}}' | mail -ne -s'Users SVN commits' email@email.com
在命令行中可以正常工作。
当我将其粘贴到crontab中时,我得到以下错误消息:
/bin/sh: -c: line 0: unexpected EOF while looking for matching `)'
/bin/sh: -c: line 1: syntax error: unexpected end of file
这需要如何引用才能工作?
在使用cron时,通过将所有内容放入shell脚本中,然后从cron调用shell脚本来避免此类问题的麻烦。
这个方法很常用,也是个好主意,因为:
- 它使你的命令易于测试(你不必做愚蠢的事情,比如在一分钟内安排执行)
- 易于手动调用,如果你必须,例如在作业失败的情况下,操作可以重新运行,而不需要触摸crontab -也可以从其他作业中调用作业,例如检查所有作业是否正常运行并重新运行那些不正常的作业
- 它将在执行时执行的与分开-让cron(只)做它最擅长的事情:调度
- 它给你完全访问shell脚本功能,或使用不同的shell,如perl
- 它保持crontab干净,易于阅读
- 任何开发/维护cron任务的人都知道如果你为cron任务使用一致的目录(例如/opt/cron或其他),应该去哪里查看
- 你可以把你的cron任务置于源代码控制之下——shell脚本常常因为源代码控制而被忽略,但是它们是代码,因此从源代码控制中受益
dosomething.sh:
svn log -v -r{$(date +%Y-%m-%d)}:HEAD http://therepository | awk '/^r[0-9]+ / {user=$3} {if (user=="username") {print $1 $2 $3}}' | mail -ne -s'Users SVN commits' email@email.com
和
cron 0 22 * * * /opt/cron/dosomething.sh
最简单的方法是将其保存为bash脚本,然后从cron运行该脚本。
(我本想把这当作评论而不是回答,但SO不让我评论)
乔