作为cron运行的C脚本给予权限被拒绝错误

时间:2013-03-12 13:43:39

标签: c cron

我编译了一个.c文件,想通过cron作业运行,但我最终得到了这个错误:

/bin/sh: /usr/local/bin/get1Receive.c: Permission denied. 

导致此错误的原因是什么?如何解决?

我应该在cron中运行.c文件还是在不同的编译文件中运行?

/ 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

文件get1Receive.c的结果

file get1Receive.c
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

代码片段。

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))
                {
                    //fprintf(stderr, "%s\n", mysql_error(localConn));
                    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));

2 个答案:

答案 0 :(得分:3)

如果输出此命令:

file  get1Receive1.c

显示文件名是有效的可执行文件,该部分非常不寻常,但没关系。

假设您正在使用biz14(或您的真实用户名)crontab尝试:

使用命令crontab -e在crontab中创建此行:

* * * * *  set > /tmp/myvars

等几分钟,回到crontab -e并删除该条目。

使用命令行中的set命令查看存在哪些变量和别名。 与您在/tmp/myvars中看到的情况相比较您必须通过更改运行cron作业的变量和别名来更改C代码的执行方式。

如果您正在其他人的crontab中运行cron作业,那么您遇到了更大的问题。检查get1Receive1.c上的文件权限。它所在的目录。其他用户(使用crontab的用户)必须在你的目录和get1Receive1.c上设置权限,以便作业可以运行。

示例crontab条目:

0 10 * * 1-5 /path/to/get1Receive1.c > /tmp/outputfile

阅读/tmp/outputfile,看看你得到了什么。您在代码中使用printfprintf仅写入控制终端。没有控制终端,因此将printf内容重定向到文件。

此问题的最后努力: 检查一切的退货代码。所有C函数如fread(),任何db函数等。如果返回代码给出失败响应(这些对于不同的函数调用是不同的),则报告错误编号行号和函数 - gcc提供 LINE func 。示例:

printf("error on line %d in my code %s, error message =%s\n", __LINE__, __func__, [string of error message]);

如果您没有检查返回代码,那么您编写的C代码非常差。

请立即检查退货代码!

答案 1 :(得分:1)

许可证明你可以有两个问题。 1.'c'文件的权限不允许您运行它的人运行它。 2.您正在使用没有权限的脚本运行cron。

这是一篇有用的帖子:How to give permission for the cron job file?

您正在运行'c'文件并将其称为脚本这一事实使我认为您正在使用C shell而不是将其编写为需要编译并生成可执行文件的C语言程序由cron运行。如果您没有使用gcc或从未在“C”脚本上调用gcc,那么它不是C并将其称为C shell以避免混淆。