Oracle 開発時に発生するエラー

ORA-27369: job of type EXECUTABLE failed with exit code: Operation not permitted

EXECUTABLE な JOB で Operation not permitted が発生

現象

UNIX 系において dbms_scheduler を使用して job_type を 'EXECUTABLE' にしてシェルスクリプトを実行している場合

Operation not permitted は「許可されていない操作です」であるがファイルのアクセス権限や実行権限なども問題ない場合でも発生する。

以下のような bash を使用したファイル権限に関係ないスクリプトでエラーが発生する。

#!/bin/bash
touch /tmp/ccc.txt

スクリプト内の権限不足に関するエラーログを確認するには USER_SCHEDULER_JOB_RUN_DETAILS ディクショナリの ADDITIONAL_INFO 列(※1) に格納されているので、そちらを確認とトレースしやすい。

(※1) 標準エラー出力(stderr) に出力された最初の 2000 バイトが格納される。

SQL> alter session set nls_timestamp_tz_format = 'yyyy-mm-dd hh24:mi:ss';
SQL> column log_date for a20
SQL> column status for a10
SQL> column additional_info for a80
SQL> set linesize 200
SQL> select log_date, status, additional_info
  2  from  user_scheduler_job_run_details
  3  where job_name = 'MY_JOB#1' -- JOB の名前
  4  order by log_date desc;
LOG_DATE             STATUS     ADDITIONAL_INFO
-------------------- ---------- ------------------------------------------------------------
2011-06-04 17:29:38  FAILED     ORA-27369: タイプEXECUTABLEのジョブが、次の終了コードで失敗
                                しました: No such file or directory
                                STANDARD_ERROR="mkdir: cannot create directory `ccc': Permis
                                sion denied
                                rm: cannot remove `/tmp/ccc.txt': Operation not permitted
                                touch: cannot touch `/tmp/ccc.txt': Permission denied"
 
2011-06-04 17:25:47  SUCCEEDED  STANDARD_ERROR="mkdir: cannot create directory `ccc': Permis
                                sion denied
                                rm: cannot remove `/tmp/ccc.txt': Operation not permitted
                                touch: cannot touch `/tmp/ccc.txt': Permission denied"
 
2011-06-04 17:21:54  FAILED     ORA-27369: タイプEXECUTABLEのジョブが、次の終了コードで失敗
                                しました: Operation not permitted
                                STANDARD_ERROR="rm: cannot remove `/tmp/ccc.txt': Operation
                                not permitted
                                touch: cannot touch `/tmp/ccc.txt': Permission denied"

対応

スクリプトの終了コードは明示的に記述しておく。

#!/bin/bash
touch /tmp/test.log
exit 0

明示的な exit を記述しない場合には 1 が戻され 「Operation not permitted 」のエラーとなっているように見える。
exit に1以上の値を設定すると C 言語の errno に相当するエラーの内容が戻されるので合わせて気をつけるようにする。

エラーコード番号は /usr/include/errno.h に定義されている。

#define	EPERM		 1	/* Operation not permitted */
#define	ENOENT		 2	/* No such file or directory */
#define	ESRCH		 3	/* No such process */
#define	EINTR		 4	/* Interrupted system call */
#define	EIO		 5	/* I/O error */
#define	ENXIO		 6	/* No such device or address */
....


一覧ページへ戻る

OTN (Oracle Technology Network)によるエラーメッセージによる情報だけでは、対処に困ったエラーについてのプラクティスです。
ベスト・プラクティスというわけではないので、書いてあることに固執しないで広い視野でエラー対応してください。

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)