cron ジョブリダイレクトはまだ出力されません。

cron ジョブリダイレクトはまだ出力されません。

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はに渡され、親シェルは/nullbash書き込まれます。それ親。最上位プロセスにはCROND書き込み可能なFDはありません。また、どのプロセスが/var/log/dailys/aide-20170803.out最初に空のファイルを生成するのかわかりません。どんどん気になりますね…

アップデート2

すべては次のように始まりますDISASTIGRHEL-07-020030/usr/sbin/aide --check 2>&1 | /bin/mail ...私はこれをテストし、それが動作することがわかりました。出力リダイレクトの代わりにパイプを使用するのはなぜですか?

メールバージョンのパイプラインに戻り、PIDとFDをスキャンしました。バッシュパイピング配列を使用すると、aideFD1と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を使用して独自の操作を実行するため、リダイレクトは失敗します。

おすすめ記事