0

コンパイルした .c ファイルがあり、cron ジョブを介して実行したいのですが、最終的に次のエラーが発生します。

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

このエラーの原因と修正方法を教えてください。

.cファイルを cron または別のコンパイル済みファイルで実行する必要がありますか?

/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));
4

2 に答える 2

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あなたが得たものを見るために読んでください。コードで使用printfしています。 printf制御端末にのみ書き込みます。制御端末がないためprintf、ファイルにリダイレクトします。

この問題に対する最後の取り組み: EVERYTHING の戻りコードを確認してください。fread() のようなすべての C 関数、任意の db 関数など。戻りコードが失敗応答を返す場合 (これらは関数呼び出しごとに異なります)、エラー番号、行番号、および関数を報告します - gcc はLINEおよびfuncを提供します。例:

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

リターン コードをチェックしないと、非常に貧弱な C コードを書いていることになります。

リターン コードを確認してください。

于 2013-03-12T14:14:38.650 に答える
1

許可に関しては、2 つの問題が発生する可能性があります。1. 'c' ファイルのパーミッションは、あなたがそれを実行している人にそれを実行することを許可していません。2. 権限のないスクリプトで cron を実行しています。

ここに役立つ投稿があります:cronジョブファイルに許可を与える方法は?

「c」ファイルを実行し、それをスクリプトとして参照しているという事実は、C シェルを使用していて、コンパイルする必要があり、生成された実行可能ファイルをクローン。gcc を使用していない場合、または 'C' スクリプトで gcc を呼び出したことがない場合は、混乱を避けるために C ではなく、C シェルと呼んでください。

于 2013-03-12T14:14:13.393 に答える