StackOverflowからこの質問をここにコピーしました...
EPELリポジトリ(0.5.9)からincronをインストールしました(質問する前に、はい、ソースをダウンロードしてローカルでコンパイルしました(0.5.10);同じ結果)。CentOS6.4でプロセスをセットアップしようとしています(最終)ローカルUbuntu 12.04マシンでプロトタイプを正常に作成した仮想ボックス(incron
を含むプロセスはUbuntuで完全に機能します):
事前の情報:
visudo
を使用してNOPASSWDで実行可能ファイルをすべてに呼び出し、いくつかの権限の問題を回避しています...ここに記載されているように、私はincronのポリシーを適用しようとしました http://blog.siphos.be/2013/05/a-selinux-policy-for-incron-finishing-up/ しかし、私は保ちます取得
_libsepol.policydb_read: policydb magic number 0x696c6f70 does not match expected magic number 0xf97cff8c or 0xf97cff8d semodule_package: Error while reading policy module from incron.te
_
_semodule_package
_を使用しようとしたとき
スクリプト自体とプレスクリプト_caller.sh
_の両方で環境を定義しようとしました。これを行うことで、スクリプトが_env > /tmp/envfile.txt
_のクローンで実行されていることを示す_Sudo env
_を実行できます(私が意図したとおり)ただし、スクリプトからの出力はまだ得られません。スクリプトが入力ファイルに対して実行するはずの作業またはログのいずれかです...
権限が必要ですよね? (ルートファイルシステムで_chmod -r 777
_を実行するだけでは、あと1日です;))
Ubuntu 12.04では、_Sudo incrotab -e
_を実行し、_/tmp/ IN_CREATE,IN_NO_LOOP env > /home/username/envfile.txt
_を入力するという単純な動作は、incronのドキュメントで示唆されているように、root/Sudo環境ですでにincronが実行されていることを示しています。
これはすべてSELinux関連のものですか、それともCentOSでこれを非常に難しくしている他の何かがありますか?
_Sudo /path/to/my/script.sh arguments
_を使用してコマンドラインからスクリプトを呼び出すと、チャームのように機能します。
あるいは、_caller.sh
_を呼び出すとすべて正常に動作しますが、_caller.sh
_がincrond
によって呼び出されると、同じように_env > /dev/pts/0
_を呼び出すこともできません。 (ただし、私は[〜#〜] can [〜#〜]_env > /tmp/envfile.txt
_
_Sudo service incrond status
_は、incrondが実行されていることを確認します。 rootおよびmyusernameが_/etc/incron.allow
_に追加され、_/etc/incron.deny
_は空です。
ルートの私のincrotabは:
_/path/to/dropfolder/ IN_CLOSE_WRITE Sudo /path/to/my/script.sh $@/$#
_
_/path/to/dropfolder/
_のイベントは、有用な結果を何も発生させません。ログは/ var/log/cronに生成され、メッセージは表示されず、フォルダー内のファイルに対してアクションは発生しません。
だから私は調査しました:cron
は最小限の環境で実行し、複雑なコマンド/スクリプトを実行するには、_.bashrc
_を実行するか、cronコマンドの最初にPATHをエクスポートする必要があるかもしれません。
編集:ドキュメントでは、システムテーブルまたはルートからincron
を実行すると、そのホスト環境からenvが取得されるため、ルート以外のユーザーが実行するincron
のみがソートを必要とするenvまたはPATHの操作
つまり…rootのincrontab:
_/path/to/dropfolder IN_CLOSE_WRITE . /home/myusername/.bashrc; export PATH=$PATH:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin; Sudo /path/to/my/script.sh $@/$#"
_
サイコロなし... _&&
_ =サイコロの代わりに_;
_を試しました。上記のバリエーションについて考えることができるなら、私はおそらくそれを試しました…
それでは、少し_restorecond -R /usr/sbin/incrond /etc/incron*
_アクションを試してみましょう!ああ、そこにも変化はありません。 _service incrond stop
_の後に_service incrond start
_が続き、次に_service incrond restart
_…nope、nope、nopeが続きます。
抜本的な対策:_yum remove incron
_および_yum install incron
_、_chkconfig incrond on
_、そして適切な対策として_Sudo reboot
_!
古い_touch ./autorelabel
_とリブートはどうですか?いや!
何もない。
_/tmp/ IN_ALL_EVENTS echo boo> > /home/myusername/boofile.txt
_からも何も取得しないため、_env > envfile.txt
_を実行してincron
が疎環境で実行されているかどうかを確認することもできません…(上記の注を参照)
それでも:_service incrond status
_はincrond (pid xxxx) is running...
を生成します
_/var/log/cron
_をさらに調べると、次のような結果が得られます。Aug 14 15:05:30 hostname incrond[1584]: (root) CMD (Sudo /path/to/DropFolder/script/subfolder/script-Beta-1.sh /home/username/DropFolder/testfile.file)
-yesスクリプトが実行可能であることを確認しました。
ルートのincrontabを_/tmp/ IN_ALL_EVENTS,IN_NO_LOOP env > /tmp/envfile.txt
_を含むように設定すると、何も得られません。末尾_/var/log/cron
_には以下が含まれます:Aug 15 10:06:32 hostname incrond[1584]: (root) CMD (env > /tmp/envfile.txt)
しかし、ファイルは_/tmp/
_に存在しません
だからincrondは確かに何かをしようとしていますが、どこにも出力がありません... _echo > /dev/pts/0
_でもnadaの結果を生成します。
ルートのincrontab
_/tmp/ IN_ALL_EVENTS,IN_NO_LOOP . ./home/print/.bashrc; env > /tmp/envfile.txt
_を、いくつかのスレッドで提案されているように作成した場合、cron
環境の問題への対処がわかった_Aug 15 12:30:25 hostname incrond[1726]: cannot exec process: Permission denied
_ここでpid
は、コマンドを発行したと主張するものとは異なるため、明らかにここでいくつかの子プロセスのスポーンが発生します...それは上記のSELinuxポリシーリンクで言及されており、それらは関連していると感じますが、PREMISSIVEおよびDISABLED SELinux設定はそれを気にしないでください?
sELinuxをDISABLEDに設定しようとする前に、_/var/log/audit/audit.log
_にエントリが表示されました。これは、incronが何かを実行しようとしていることを示し、最後に_res=success
_のタグが付けられました...しかし、何も起こりません! SELinuxをDISABLEDに設定し、PERMISSIVEに戻して再起動するため(数回)、_/var/log/audit/audit.log
_などの関連項目以外のincrondに関連する_service start
_のエントリを取得できません。 WTH?
上記のすべてのincron戦術をroot(_Sudo incrontab
_)として、プレーンユーザーとして、およびシステムテーブル(_/etc/incron.d
_にある)を使用して同じ結果を試しました:p
(流しの内容を理解している限り)私はこれで台所の流しを投げましたが、解決策が見つかりません...何が欠けていますか?誰かが私をバカみたいに感じさせてくれることを願っています!
わかりました、ここに答えがあります:
すべてのドキュメントにもかかわらず、それが反対であることを宣言しているのを見つけることができますが、CentOS 6.4でのincrond
はスパース環境で実行され、cron
として動作します。これはUbuntuでは当てはまりません。incronはシステムテーブルとルートテーブルのルートから環境を継承し、疎な環境で実行されるのはユーザーテーブルのみです。もちろん、これは、スクリプト(私)を呼び出す場合、スクリプトはその環境を構築する必要があり、すべてのものに完全なパスが必要であることを意味します。 [〜#〜]すべて[〜#〜]。 (まあ、シェル組み込みを除いて:p)
多数のGoogleとBing、Stack Overflow、Server Faultのすべての検索でcron
がこのように動作していることがわかりましたが、incron
はドキュメントに記載されているとおりに動作していることも示しているようです。 Ubuntuの下で...
要するに、今はうまくいきます。
(これはincron
にSELinuxセキュリティポリシーを適用する際の私の問題には対応していませんが、後で別の投稿で心配します...)
同じ問題がありました。多くの試行錯誤の後、私は私のオリジナルのラインが
/path/to/watch IN_CLOSE_WRITE /usr/local/bin/mycommand $@/$#
動作しませんが、以下は動作します:
/path/to/watch IN_CLOSE_WRITE /bin/sh /usr/local/bin/mycommand $@/$#
私はincronがShebangのスクリプトを(まだ?)尊重しておらず、コマンド内にインタープリターが必要だと思います。
編集:もう少しテストした後、コマンドが(bashまたはシェル)スクリプトの場合、.sh拡張子が必要になるか、/ bin/shのようなインタープリターを前に付ける必要があることがわかりました。したがって、次の例は両方とも機能します(少なくともCentOS 6.4で)
/path/to/watch IN_CLOSE_WRITE /bin/sh /usr/local/bin/mycommand $@/$#
/path/to/watch IN_CLOSE_WRITE /usr/local/bin/mycommand.sh $@/$#
評判が不十分なため、私の貢献はuser199085のコメントではなく、個別の回答として提供されます。
はい、OPはcentOSを言っていますが、ubuntuの人々のために、私はSudo -u my_user_name
の前に bin/sh
ビット。したがって、ラインは
/path/to/watch IN_CLOSE_WRITE Sudo -u my_user_name /bin/sh /usr/local/bin/mycommand $@/$#
メッセージincrond: cannot exec process: Permission denied
追加してみてください x 実行するスクリプトへの権限(この権限はftp
、sftp
などによって「削除」されている可能性があります)
chmod +x /srv/datadisk01/your/incron_script.sh