gpt4 book ai didi

mysql - C 代码无法在 cron 中运行选择查询

转载 作者:行者123 更新时间:2023-11-30 18:32:14 24 4
gpt4 key购买 nike

我们有如下 C 代码。这就是我们编译它的方式 gcc -o get1Receive $(mysql_config --cflags) get1ReceiveSource.c $(mysql_config --libs) -lrt。当我们从终端运行时,我工作得很好。然后我们尝试使用 cron 作业运行它,当我们查看这两行时 printf("\nNumf of fields : %d",num_fields);和 printf("\n行数:%lu",mysql_num_rows(localRes1));。第一行显示 4 作为值,第二行从不给出任何值,并且始终为 0。我们采用相同的选择查询并在数据库上运行并确认有值,但在通过 cron 作业运行时它没有传递。脚本也被赋予可执行权限。

#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <mysql.h>
#include <string.h>

int flag = 0;



int main () {
MYSQL *localConn;
MYSQL_RES *localRes1;
MYSQL_ROW localRow1;
char *server = "localhost";
char *user = "user1";
char *password = "*****";
char *database = "test1";
localConn = mysql_init(NULL);
if (!mysql_real_connect(localConn, server,
user, password, database, 0, NULL, 0)) {
fprintf(stderr, "%s\n", mysql_error(localConn));
exit(1);
}

struct timeval tv;
char queryBuf1[500],queryBuf2[500];
char buff1[20] = {0};
char buff2[20] = {0};
gettimeofday (&tv, NULL);
//fprintf (stderr, "[%d.%06d] Flag set to 1 on ", tv.tv_sec, tv.tv_usec);
//tv.tv_sec -= 5;
strftime(buff1, 20, "%Y-%m-%d %H:%M:00", localtime(&tv.tv_sec));
strftime(buff2, 20, "%Y-%m-%d %H:%M:59", localtime(&tv.tv_sec));
printf("\nTime from %s", buff1);
printf("\nTime to %s", buff2);

sprintf(queryBuf1,"SELECT ipDest, macDest,portDest, sum(totalBits) FROM dataReceive WHERE timeStampID between '%s' And '%s' GROUP BY ipDest, macDest, portDest ",buff1,buff2);
printf("\nQuery receive %s",queryBuf1);


if(mysql_query(localConn, queryBuf1))
{
printf("Error in first query of select %s\n",mysql_error(localConn));
exit(1);
}

localRes1 = mysql_store_result(localConn);
int num_fields = mysql_num_fields(localRes1);

printf("\nNumf of fields : %d",num_fields);
printf("\nNof of row : %lu",mysql_num_rows(localRes1));

while((localRow1 = mysql_fetch_row(localRes1)) !=NULL)
{
int totalBits = atoi(localRow1[3]);

printf("totalBits %d\n", totalBits);
printf("RECEIVE %s,%s\n", localRow1[0], localRow1[1]);
if(totalBits>5000)
{
sprintf(queryBuf1,"INSERT INTO alertReceive1 (timeStampID,ipDest, macDest, portDest, totalBits)VALUES ('%s','%s','%s','%s',%s)",buff1, localRow1[0],localRow1[1],localRow1[2],localRow1[3]);
printf("Query 1 before executing %s\n",queryBuf1);
if (mysql_real_query(localConn,queryBuf1,strlen(queryBuf1))) {
printf("Error in first insert %s\n",mysql_error(localConn));
fprintf(stderr, "%s\n", mysql_error(localConn));
exit(1);
}
//printf("Query 1 after executing %s\n",queryBuf1);*/
}
}


mysql_free_result(localRes1);
mysql_close(localConn);


}

我们已经运行了这个命令文件 get1Receive 并得到结果

file get1Receive
get1Receive.c: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

我们还运行了此命令 * * * * * set >/tmp/myvars,下面是结果。

GROUPS=()
HOME=/root
HOSTNAME=capture
HOSTTYPE=x86_64
IFS='
'
LOGNAME=root
MACHTYPE=x86_64-redhat-linux-gnu
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/bin:/bin
POSIXLY_CORRECT=y
PPID=11086
PS4='+ '
PWD=/root
SHELL=/bin/sh
SHELLOPTS=braceexpand:hashall:interactive-comments:posix
SHLVL=1
TERM=dumb
UID=0
USER=root
_=/bin/sh

最佳答案

通用提示(另请参阅我的评论):

  • 花时间阅读文档,特别是来自 Advanced Linux Programming 的文档, man pages (您也可以通过在终端上输入 man manman 2 intro 等来获得),以及 MySQL 5.5 reference 。请务必了解 GIYFSTFW 的含义。

  • \n 放在 printf 格式字符串的末尾,而不是开头。

  • 此外,如果合适,请调用 fflush(NULL),特别是在任何 MySQL 查询之前,例如在 mysql_real_query 调用之前以及 while 循环结束时

  • 使用 gcc -Wall -g 进行编译,例如在终端中使用以下命令

    gcc -Wall -g $(mysql_config --cflags) get1ReceiveSource.c \
    $(mysql_config --libs) -lrt -o get1Receive
  • 改进代码,直到不再发出警告。 (您甚至可能想要使用 -Wall -Wextra 而不仅仅是 -Wall)。不要忘记使用像 git 这样的版本控制系统。

  • 使用gdb调试器(您需要learn如何使用它)。

    (只有当您确定代码中不再有错误时,才能在编译命令中将 -g 替换为 -O2 -g)

  • 使用sizeof;大多数出现的 20 应该是 sizeof,或者至少使用 #define SMALLSIZE 20,然后仅使用 SMALLSIZE > 不是 20

  • 使用snprintf而不是sprintf(并测试其结果大小,应该合适!)。 snprintf(3)需要一个额外的大小参数,例如

     if (snprintf(querybuf, sizeof querybuf,
    "SELECT ipDest, macDest, portDest, sum(totalBits)"
    " FROM dataReceive"
    " WHERE timeStampID between '%s' And '%s' "
    " GROUP BY ipDest, macDest, portDest ",
    buff1, buff2) >= (int) (sizeof querybuf))
    abort();
  • 考虑使用syslog(3)使用 openlog,并查看您的系统日志。

我不明白 queryBuf1 是如何声明的。 (您发布的代码可能甚至无法编译!)。您可能需要类似 char querybuf[512]; ...

最重要的是,在 mysql_fetch_row 循环中调用 mysql_real_query错误:您应该在发出下一个 MySQL 查询之前获取所有行。了解更多关于 MySQL C API .

您还忘记测试mysql_store_result(localConn)的结果localRes1;当localRes1NULL时,以某种方式(可能通过syslog)显示mysql_error(localConn) ....

关于mysql - C 代码无法在 cron 中运行选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15459278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com