cronジョブが長さ0のファイルを生成する理由に対するすべての答えは、典型的な出力リダイレクトを使用することで要約されます。それでもまだ役に立ちません。
# cat /etc/cron.d/aide
SHELL=/bin/bash
48 22 * * * root /usr/sbin/aide --check >/var/log/dailys/aide-$( date +\%Y\%m\%d ).out 2>&1
長さが0のファイルのみが受信されます。そのコマンドを取得してbashプロンプトで実行すると(バックスラッシュを削除する)、埋め込まれたファイルが得られます。
アップデート1
@rudymire私のファイル記述子を追跡するには、straceを使用することをお勧めします。失敗しましたが面白い方法でした。
# cat /etc/cron.d/aide
SHELL=/bin/bash
21 13 * * * root strace /usr/sbin/aide --check >/var/log/dailys/aide-$( date +\%Y\%m\%d ).out 2>/var/log/dailys/strace.out
ジョブが実行され、aideが出力なしで実行され、straceはファイル記述子の割り当てが3で始まることを示します。唯一の参照は、/var/log/dailys
補佐官がディレクトリ内のファイルの権限と内容を確認するときです。だから私は別のことを試しました。 cronタスクを起動し、さまざまなプロセスファイル記述子を見てみましょう。結局のところ、すべてのことを終わらせるために、もう少し速く動かさなければならず、このトリックポケットにあった方が、より後続の手がかりを提供しました。
# ps -ef | grep aide
root 27794 27792 <stuff> /bin/bash -c /usr/sbin/aide --check > /var/log/dailys/aide-$( date +%Y%m%d ).out 2>&1
root 27795 27794 <stuff> /usr/sbin/aide --check
# ls -l /proc/27794/fd
lr-x------. <stuff> 0 -> pipe:[14123645]
l-wx------. <stuff> 1 -> pipe:[14123646]
l-wx------. <stuff> 2 -> pipe:[14123646]
# ls -l /proc/27795/fd
lr-x------. <stuff> 0 -> pipe:[14123645]
lrwx------. <stuff> 1 -> /null
lrwx------. <stuff> 2 -> /null
<stuff>
# ls -l /proc/27792/fd
lrwx------. <stuff> 0 -> /dev/null
lrwx------. <stuff> 1 -> /dev/null
lrwx------. <stuff> 2 -> /dev/null
lr-x------. <stuff> 5 -> anon_inode:inotify
lr-x------. <stuff> 6 -> pipe:[14123646]
# ps -ef | grep 27792
root 27792 3850 <stuff> CROND
<stuff>
# ps -ef | grep 3850
root 3850 1 <stuff> crond
<stuff>
したがって、ワーカープロセスのSTDOUTとSTDERRはに渡され、親シェルは/null
にbash
書き込まれます。それ親。最上位プロセスにはCROND
書き込み可能なFDはありません。また、どのプロセスが/var/log/dailys/aide-20170803.out
最初に空のファイルを生成するのかわかりません。どんどん気になりますね…
アップデート2
すべては次のように始まりますDISASTIGRHEL-07-020030、/usr/sbin/aide --check 2>&1 | /bin/mail ...
私はこれをテストし、それが動作することがわかりました。出力リダイレクトの代わりにパイプを使用するのはなぜですか?
メールバージョンのパイプラインに戻り、PIDとFDをスキャンしました。バッシュパイピング配列を使用すると、aide
FD1とFD2が実際に上に戻るのではなく、パイプを介して埋められます。それではしばらく遊んでみましょう...
# cat /etc/cron.d/aide
SHELL=/bin/bash
41 14 * * * root /usr/sbin/aide --check | tee /var/log/dailys/aide-$( date +%\Y\%m\%d ).out 1>/dev/null 2>&1
aide
これはうまくいきます...コードがパイプを通さずに出力がリダイレクトされるのを防いでいるというかすかな感じです。 24時間後に解決策を作成します。
答え1
selinuxを使用しています。 「setenforce 0」を実行してcronを実行すると、期待した結果が得られます。ルートシェルでは、selinuxコンテキストは次のようになります。
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
ただし、Cronで実行すると、selinuxコンテキストは次から始まります。
system_u:system_r:system_cronjob_t:s0-s0:c0.c1023
|
動作する他のコマンドで次のこともできます。| cat > file
その後、補佐官はselinuxを使用して独自の操作を実行するため、リダイレクトは失敗します。