web-dev-qa-db-ja.com

Incrondは実行されているが、コマンドは実行されていないCentOS 6.4

StackOverflowからこの質問をここにコピーしました...

EPELリポジトリ(0.5.9)からincronをインストールしました(質問する前に、はい、ソースをダウンロードしてローカルでコンパイルしました(0.5.10);同じ結果)。CentOS6.4でプロセスをセットアップしようとしています(最終)ローカルUbuntu 12.04マシンでプロトタイプを正常に作成した仮想ボックス(incronを含むプロセスはUbuntuで完全に機能します):

事前の情報:

  • SELinuxはPERMISSIVEに設定されています(私もDISABLEDを試しましたが、違いはないようです!)
  • スクリプトを追加し、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

(流しの内容を理解している限り)私はこれで台所の流しを投げましたが、解決策が見つかりません...何が欠けていますか?誰かが私をバカみたいに感じさせてくれることを願っています!

4
JawzX

わかりました、ここに答えがあります:

すべてのドキュメントにもかかわらず、それが反対であることを宣言しているのを見つけることができますが、CentOS 6.4でのincrondはスパース環境で実行され、cronとして動作します。これはUbuntuでは当てはまりません。incronはシステムテーブルとルートテーブルのルートから環境を継承し、疎な環境で実行されるのはユーザーテーブルのみです。もちろん、これは、スクリプト(私)を呼び出す場合、スクリプトはその環境を構築する必要があり、すべてのものに完全なパスが必要であることを意味します。 [〜#〜]すべて[〜#〜]。 (まあ、シェル組み込みを除いて:p)

多数のGoogleとBing、Stack Overflow、Server Faultのすべての検索でcronがこのように動作していることがわかりましたが、incronはドキュメントに記載されているとおりに動作していることも示しているようです。 Ubuntuの下で...

要するに、今はうまくいきます。

  • 私はこれがちょうど示すようになると思います:疑わしい場合は、環境を定義し、フルパスを使用してください...実際には、それをすべての時間に行うだけで、頭痛を軽減できます。

(これはincronにSELinuxセキュリティポリシーを適用する際の私の問題には対応していませんが、後で別の投稿で心配します...)

2
JawzX

同じ問題がありました。多くの試行錯誤の後、私は私のオリジナルのラインが

/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 $@/$#
3
user199085

評判が不十分なため、私の貢献は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 $@/$#

1
abdus_salam

メッセージincrond: cannot exec process: Permission denied

追加してみてください x 実行するスクリプトへの権限(この権限はftpsftpなどによって「削除」されている可能性があります)

chmod +x /srv/datadisk01/your/incron_script.sh
0
Pierre