SVN | awk | mail可以在bash中工作,但不能在cron job中工作



我有以下命令来显示对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不让我评论)

相关内容

最新更新