LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2831|回复: 10

请教通过linux的cron调用perl的问题!

[复制链接]
发表于 2003-12-23 16:39:08 | 显示全部楼层 |阅读模式
我写了一个perl脚本,手工执行没什么问题,执行结果也正确,但是当我通过cron来调用时,也执行了,执行也没什么错误,就是结果不对,程序如下,大概过程是通过ssh自动登陆到远程计算机,执行oracle数据备份操作,完成后,退出在通过sftp登陆上去下载该文件,通过cron调用后,执行了,但是没有备份文件也没有下载文件.

  1. #!/usr/bin/perl
  2. #  
  3. #  backup contract info data
  4. #
  5. #    2003-12-22
  6. #
  7. use Expect;
  8. sub getCurrentDate
  9. {
  10. $now = time();
  11. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);
  12. $mon++;
  13. $year+=1900;
  14. if($mday <1)
  15. {
  16.         if($mon ==1 || $mon ==3 || $mon==5 || $mon==7||$mon==8||$mon==10||$mon==12)
  17.         {
  18.                 $mday=30;
  19.                 if($mon==3 && $year%4==0)
  20.                 {
  21.                         $mday = 29;
  22.                 }
  23.                 elsif($mon ==3)
  24.                 {
  25.                         $mday =28;
  26.                 }
  27.         }
  28.         else
  29.         {
  30.                 $mday = 31;
  31.         }
  32. }
  33. $current_time = $year."-".$mon."-".$mday."-".$hour.":".$min.":".$sec;
  34. return $current_time;
  35. }

  36. $dbIP="192.168.0.21";
  37. $dbUserName="oracle";
  38. $dbPassword="seafox";

  39. $oracleParam="oauser/guandaoa2000";
  40. $backupPath="/home/oracle/backup";
  41. $currentDate=getCurrentDate;
  42. $fileName="OADB$currentDate.dmp";
  43. $backupFile="$backupPath/$fileName";

  44. my $timeout = 2;
  45. my $delay = 0;
  46. my $cmd    = "ssh";

  47. my @params=("$dbIP","-l","$dbUserName");

  48. # backup file
  49. print("Begin backup file ....\n");
  50. $exp = Expect->spawn($cmd, @params) or die "Can't spawn $cmd\n"; # create an Expect object by spawning another process


  51. $exp->expect($timeout, -re=>'[Pp]assword:');
  52. $exp->send_slow($delay, "seafox\r\n");
  53. $exp->send("ls\r\n");# send some string there:
  54. $exp->send("exp $oracleParam  file=$backupFile log=$backupPath/OAFileLog.log\r\n");
  55. $exp->send("exit\r\n");
  56. $exp->interact();
  57. $exp->hard_close();
  58. print("db exp finish.\n");
  59. #download file
  60. print("Begin download file ....\n");
  61. $cmd="sftp";
  62. $cmd="sftp $dbUserName\@$dbIP";

  63. $exp = Expect->spawn($cmd) or die "Can't spawn $cmd\n";

  64. $exp->expect($timeout, -re=>'[Pp]assword:');
  65. $an="yes";
  66. #$exp->send_slow($delay, "$an\r\n");
  67. $exp->send_slow($delay, "$dbPassword\r\n");
  68. $exp->send("ls\r\n");
  69. $exp->send("cd $backupPath\r\n");
  70. $exp->send("get $fileName\r\n");
  71. #$exp->send("get /home/oracle/OA.dmp\r\n");
  72. $exp->send("bye\r\n");
  73. $exp->interact();
  74. $exp->hard_close();

  75. print("backup finish !\n");
  76. exit 0;
复制代码
发表于 2003-12-23 20:29:34 | 显示全部楼层
好象是路径那里出问题吧。。简单点,直接用文件的全名。
发表于 2003-12-23 21:07:38 | 显示全部楼层
兄弟的cron 怎樣設置的?
发表于 2003-12-23 21:25:14 | 显示全部楼层
这是CU的apile兄的回复,大家参考一下,和home兄说的相似:

用absolute path..不要用相對路?...
對cron?碚f..沒有PATH等環境變數..
看你好像有連數據庫..請加入Orcale相關參數在你的script裡面
$ENV{XXXX} = "///xx";
发表于 2003-12-24 11:12:40 | 显示全部楼层
我遇见过这种情况,请问你是在哪里做得cron
脚本的cron最好做全局不要做个人的,否则会出现log上记载是成功执行但是却什么也没有做的问题,而同样的脚本放在/etc/crontab就没问题 ,至少redhat上我碰见过。
发表于 2003-12-25 20:16:25 | 显示全部楼层
最初由 devel 发表
这是CU的apile兄的回复,大家参考一下,和home兄说的相似:

用absolute path..不要用相對路?...
對cron?碚f..沒有PATH等環境變數..
看你好像有連數據庫..請加入Orcale相關參數在你的script裡面
$ENV{XXXX} = "///xx";

看?泶蠹乙矐擆B成這個良好習慣了
发表于 2003-12-26 10:51:25 | 显示全部楼层
用户在建立和修改crontab时所属用户和组都是root,最好把这些属性改为你所需要启用crontab的用户和组,,你的用户默认路径是否正确,这个需要你在profile里设定好!
发表于 2003-12-29 12:03:59 | 显示全部楼层
主要是环境变量,权限,与程序内变量设置问题。
 楼主| 发表于 2004-1-5 09:34:09 | 显示全部楼层

非常感谢各位的解答,虽然我的问题还没有解决,谢谢!!

非常感谢各位的解答,虽然我的问题还没有解决,谢谢!!
发表于 2004-1-5 15:36:46 | 显示全部楼层

回复: 非常感谢各位的解答,虽然我的问题还没有解决,谢谢!!

最初由 jtome 发表
非常感谢各位的解答,虽然我的问题还没有解决,谢谢!!


现在有什么问题? 不是路径和。。。。。:ask

“get /home/oracle/OA.dmp\r\n”这些不要\r\n试试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表