- 论坛徽章:
- 0
|
我要在程序里根据设置的条件提交crontab作业.现在不管是用system还是用fork后execl都不行,奇怪的是把这个程序的进程杀死后发现这时crontab提交上去了。同样的我写了一个小测试程序不管用system还是execl都是可以的.我已经折腾了一周实在没办法上来求助各位了,希望能得到的帮助。
我的环境是:
平台:HP-UX 11
编译器:aCC
使用Roguewave Thread.h++多线程
RWBoolean _regCron(const RWCString& type,
const RWCString& group_name,
const RWSlistCollectables& sw_info,
const RWCString& time_info,
const RWCString& uid,
const RWSlistCollectables& check_time_info)
{
RWCString crontab_path = AppServer::GetInstance()->;getCrontabPath();
RWCString crontab_file = crontab_path + "/crontab.txt";
RWCString script_file = crontab_path + "/script.sh";
RWCString crontab_action = crontab_path + "/" + group_name + ".sh";
FILE *fp_crontab = fopen(crontab_file.data(), "w+"
FILE *fp_action = fopen(crontab_action.data(),"w+"
FILE *fp_script = fopen(script_file.data(),"w+"
RWBoolean ret = FALSE;
if ( (fp_crontab==NULL) || (fp_action==NULL) || (fp_script==NULL))
{
if (fp_crontab == NULL)
{
TRACE_LOG("@@ %s,%d-->;fopen(%s) failed, errno=%d",
__FILE__, __LINE__, crontab_file.data(), errno);
}
if (fp_action == NULL)
{
TRACE_LOG("@@ %s,%d-->;fopen(%s) failed, errno=%d",
__FILE__, __LINE__, crontab_action.data(), errno);
}
if (fp_script == NULL)
{
TRACE_LOG("@@ %s,%d-->;fopen(%s) failed, errno=%d",
__FILE__, __LINE__, script_file.data(), errno);
}
}
else
{
fprintf(fp_script,"#!/bin/sh\n"
fprintf(fp_script,"crontab %s\n",crontab_file.data());
int cron_num = check_time_info.entries();
for (int i=0;i<cron_num;++i)
{
RWSlistCollectables *pList = (RWSlistCollectables*)check_time_info.at(i);
RWCString check_time_ = *((RWCollectableString*)pList->;at(0));
RWCString group_name_ = *((RWCollectableString*)pList->;at(1));
fprintf(fp_crontab,"%s * %s/%s.sh\n",check_time_.data(),
crontab_path.data(),group_name_.data());
}
ret = TRUE;
fclose(fp_crontab);
fclose(fp_action);
fclose(fp_script);
//以下修改script.sh权限,加上可执行权限
struct stat statbuf;
if (stat(script_file.data(),&statbuf)<0)
{
TRACE("## %s,%d-->;Failed to stat file",
__FILE__, __LINE__);
}
else
{
if (chmod(script_file.data(),statbuf.st_mode|S_IXUSR)<0)
{
TRACE("## %s,%d-->;Failed to chmod file",
__FILE__, __LINE__);
}
}
if (stat(crontab_action.data(),&statbuf)<0)
{
TRACE("## %s,%d-->;Failed to stat file",
__FILE__, __LINE__);
}
else
{
if (chmod(crontab_action.data(),statbuf.st_mode|S_IXUSR)<0)
{
TRACE("## %s,%d-->;Failed to chmod file",
__FILE__, __LINE__);
}
else
{
RWCString cmd = script_file;
int child_pid_ = fork();
int statval;
if (child_pid_ < 0)
{
TRACE("@@ %s,%d-->;fork() failed, errno=%d",
__FILE__, __LINE__, errno);
return FALSE;
}
else if (child_pid_ >; 0)
{ // parent process
TRACE("## %s,%d-->;parent pid=%d fork child pid=%d\n",
__FILE__, __LINE__, getpid(), child_pid_);
return TRUE;
}
else
{ // child process
TRACE("## %s,%d-->;child process pid=%d\ncmd=%s",
__FILE__, __LINE__,getpid(),cmd.data());
if (execl(cmd.data(), cmd.data(), 0) == -1)
//Important!!!!!!这里提交script.sh脚本
//脚本的内容为:
// #!/sh/bin
// crontab crontab.txt
//奇怪的是这里execl执行成功了,但是crontab没有提交
{
TRACE_LOG("@@ %s,%d-->;child_pid[%d], execlp(%s) failed, errno=%d",
__FILE__, __LINE__, getpid(), cmd.data(), errno);
return FALSE;
}
exit(0);
}
}
}
}
return ret;
} |
|