免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2937 | 回复: 5
打印 上一主题 下一主题

linux 、crontab和perl脚本之间 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-10 13:25 |只看该作者 |倒序浏览
您好,谢谢您进来看我提的问题,希望有遇到过这个问题或是知道怎么解决的帮帮忙,谢谢了!
问题是:为什么下面的perl脚本用./backup.pl运行正常,但是放到crontab底下就会报错呢?这个脚本是用来备份svn的。
perl脚本:


  1. #!/usr/bin/perl -w
  2. $svn_repos="/opt/svn-repos-test";
  3. $backups_dir="/home/youyan/svn-backup";
  4. $next_backup_file = "daily_incremental_backup.".`date +%Y%m%d_%H:%M`;
  5. open(IN,"$backups_dir/last_backed_up");
  6. $previous_youngest = <IN>;
  7. #chomp $previous_youngest;
  8. close IN;
  9. $youngest=`svnlook youngest $svn_repos`;
  10. chomp $youngest;
  11. if ($youngest eq $previous_youngest)
  12. {
  13.    print "No new revisions to back up...\n";
  14.    exit 0;
  15. }
  16. $first_rev = $previous_youngest + 1;
  17. $last_rev=$youngest;
  18. print "Backing up revisions $first_rev to $last_rev...\n";
  19. $svnadmin_cmd = "svnadmin dump --incremental ".
  20.                 "--revision $first_rev:$last_rev ".
  21.                 "$svn_repos>$backups_dir/$next_backup_file";
  22. `$svnadmin_cmd`;
  23. print "Compressing dump file...\n";
  24. print `gzip -9 $backups_dir/$next_backup_file`;
  25. open(LOG,">$backups_dir/last_backed_up"); #记录备份的版本号
  26. print LOG $last_rev;
  27. close LOG;
复制代码


报的错误:

Date: Fri, 10 Jul 2009 11:43:01 +0800
Message-Id: <200907100343.n6A3h155005897@localhost.localdomain>
From: root@localhost.localdomain (Cron Daemon)
To: root@localhost.localdomain
Subject: Cron <root@localhost> /home/youyan/svn-backup/daily-backup.pl
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <SHELL=/bin/bash>
X-Cron-Env: <ATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin>
X-Cron-Env: <MAILTO=root>
X-Cron-Env: <HOME=/>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>

Use of uninitialized value in scalar chomp at /home/youyan/svn-backup/daily-backup.pl line 7.
Can't exec "svnlook": No such file or directory at /home/youyan/svn-backup/daily-backup.pl line 9.
Use of uninitialized value in scalar chomp at /home/youyan/svn-backup/daily-backup.pl line 10.
Use of uninitialized value in string eq at /home/youyan/svn-backup/daily-backup.pl line 11.
Use of uninitialized value in string eq at /home/youyan/svn-backup/daily-backup.pl line 11.
No new revisions to back up...


但是crontab可以运行简单的.pl文件,这是不是说明crontab对perl中的个别命令不支持呢?而且把perl命令装在shell脚本里,在通过crontab运行也会提示一样的错误!

论坛徽章:
0
2 [报告]
发表于 2009-07-10 13:55 |只看该作者
Can't exec "svnlook": No such file or directory at /home/youyan/svn-backup/daily-backup.pl line 9.

$youngest=`svnlook youngest $svn_repos`;  显然svnlook在crobtab中未必找得到,应该用完整路径或者加到crontab的环境变量中。

crontabl与shell下的不同,无非是环境变量或者用户权限的问题

论坛徽章:
0
3 [报告]
发表于 2009-07-10 14:21 |只看该作者
同意 2 楼意见。

有两个建议供参考:

1. 加如下代码到文件开始,以便查看你的脚本运行时的环境:

  1. print $_, " : ", $ENV{$_}, "\n" foreach %ENV;
复制代码


注意 $ENV{'PATH'} 是否包含 svnlook 所在目录。

2. 建议任何open语句都应处理异常。例如:
  1. open(IN,"$backups_dir/last_backed_up") || die "can't open: $!";
复制代码

论坛徽章:
0
4 [报告]
发表于 2009-07-10 15:57 |只看该作者

回复 #3 sysengcn 的帖子

不好意思,我刚接触这个方面的东西,您能详细点说吗?比如那行代码里面填哪些内容?为什么要对open处理异常?

论坛徽章:
0
5 [报告]
发表于 2009-07-11 15:12 |只看该作者
原帖由 youyan2007 于 7/9/09 23:57 发表
不好意思,我刚接触这个方面的东西,您能详细点说吗?比如那行代码里面填哪些内容?为什么要对open处理异常?


1. 不需要填什么内容。那行代码只是显示 %ENV 这个 hash 的内容而已。

2. 因为 open 后面的代码往往依赖于 open 成功打开一个文件,然后好往里面读或者写信息。所以最好考虑如果 open 不成功的话该怎么办。大多数情况下, open 不成功,继续后面的代码已经没什么意义了。所以最好对这种情况处理一下。

论坛徽章:
0
6 [报告]
发表于 2009-07-11 21:57 |只看该作者
crontab问题,十有八九跟环境变量有关。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP