Chinaunix

标题: 手动执行一个shell没有问题,换成crontab定时执行就出错,请指点 [打印本页]

作者: zhilon    时间: 2006-07-05 18:24
标题: 手动执行一个shell没有问题,换成crontab定时执行就出错,请指点
---------
本人写了一个shell,shell文件名为execbat.sh,保存路径为:/export/home/stsuser
sehll文件内容如下:
-------------------------------------------
#!/bin/sh
cd /export/home/stsuser/nas/dts
./data_bat
------------------------------------------
shell的目的,我想先进入目录/export/home/stsuser/nas/dts
然后执行此目录下的程序data_bat

现在用手工执行,使用用户stsu,telnet登录系统,先进入目录/export/home/stsuser
直接运行shell文件./execbat.sh
data_bat程序可以可以正常执行,

现在改用crontab定时执行,使用用户stsu,telnet登录系统,crontab中加入如下任务:
25 18 * * * /export/home/stsuser/execbat.sh

说明一下,程序data_bat是pro*c程序,由data_bat.pc文件编译而成的可执行文件,
文件内容如下的形式:
------------------------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
.....
#include <sqlca.h>

main()
{
        char db_username[10];
        char db_passwd[10];
        memset(db_username,0,sizeof(db_username));
        memset(db_passwd,0,sizeof(db_passwd));
        
        /*读配置文件得到数据库用户名及密码*/
        ReadCfgFile("scfgfile.cfg","dbusername",db_username);
        ReadCfgFile("scfgfile.cfg","dbpaswd",db_passwd);
        
        EXEC SQL CONNECT :db_username IDENTIFIED by :db_passwd;
        if ( sqlca.sqlcode != 0 )
        {
                printf("connect database error. errcode[%d]",sqlca.sqlcode);
                return -1;
        }
        
        /*其他处理语句*/
        .......
        
        
        EXEC SQL COMMIT WORK RELEASE;
        return 0;
}
------------------------------------------------------------------------------------------
当用定时任务时,在连接数据库时,出现如下错误信息:
connect database error. errcode[-12545]

本人查询了错误:
ORA-12545: Connect failed because target host or object does not exist
Cause: The address specified is not valid, or the program being connected to does not exist.

看了错误,本人改了data_bat.pc代码,数据库连接处改成如下:
-------------------------------------------------------------------------------
EXEC SQL BEGIN DECLARE SECTION;
        VARCHAR  uid[200];
EXEC SQL END DECLARE SECTION;

main()
{
        char cnnstr[128];
        memset(cnnstr,0,sizeof(cnnstr));
        
        strcpy(cnnstr,"admin/nas4321@nasdat");
        strcpy ((char *)uid.arr,cnnstr);
        uid.len=(unsigned short)strlen((char *)uid.arr);
        EXEC SQL CONNECT :uid;
        if ( sqlca.sqlcode != 0 )
        {
                printf("connect database error. errcode[%d]",sqlca.sqlcode);
                return -1;
        }
        
        /*其他处理语句*/
        ...
        
-------------------------------------------------------------------------------
可用crontab定时执行还是有错:
connect database error. errcode[-12154]

本人百思不得其解,相同的用户,为何使用手工直接执行就没有任务问题,换成
crontab就会出问题,恳请高人指点,这是怎么了,如何解决?谢谢!

对了,系统为:
SunOS nas.sz.gmcc.net 5.8 Generic_117350-25 sun4u sparc SUNW,Sun-Fire

--
作者: zhilon    时间: 2006-07-05 19:03
自己顶一下,希望高人尽快指点一下,实在想不明白
作者: yg    时间: 2006-07-05 19:09
大概少环境变量吧
试试用su来执行命令,或直接在SHELL中设环境变量
作者: xiao_cui2000    时间: 2006-07-05 19:47
是呀,crontab执行的程序需要设置你所需的环境变量的
应该是ORACLE所需的环境变量都没设
作者: hezhiroy    时间: 2006-07-05 20:05
25 18 * * * . .profile;/export/home/stsuser/execbat.sh
作者: zhilon    时间: 2006-07-06 10:32
现改为:
25 18 * * * cd; ./.profile; /export/home/stsuser/execbat.sh
还是错误
晕!!!!
作者: kuaizaifeng    时间: 2006-07-06 10:58
应该是环境变量的问题。
记得有一次在安装jabberd服务器的时候,用su root装,怎么都不成功。
后来用了root直接登录进行安装,一次成功
当时很是郁闷了一阵子
作者: 800long    时间: 2006-07-06 12:51
环境变量的问题
傻办法:
用env查看与之相关的环境变量,然后在你的脚本前加入相关的  export  ..... 语句,应该就可以了。
作者: zhilon    时间: 2006-07-07 16:33
已经OK了,就是环境变量的问题,
在shell中加入用到的环境变量就可以了,
谢谢各位,




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2