0

シェルスクリプト newb here. まず、この問題について私を助けてくれた時間と労力に感謝します。

カスタム ディレクトリに保存されている /tmp とセッションを削除するには、シェル スクリプトと cron ジョブを作成する必要がありました。

私は数日前から基本を学んでおり、最初のシェル スクリプトと cron ジョブを試みています。

複数のシェル コマンドを実行して、他のコマンドが失敗した場合でもコマンドを実行できる最善の方法に困惑しています。また、失敗したコマンドについてログ レポートとメールを送信することも必要です。

アンパサンド (&&) またはセミコロンのいずれかを使用できることを認識しています。また、アンパサンドでは終了エラー チェックが許可されますが、セミコロンでは許可されないことも認識しています。

これが私のスクリプトです

TmpPurge.sh

#!/bin/bash
find /home/username/sessions -iname 'sess_*' -mmin +480 -exec rm -rf {} \; &&
find /home/username/sessions -iname 'sess_*' -mmin +240 -exec rm -rf {} \; &&
/usr/sbin/tmpwatch -umc 5 /home/username/sessions &&
/usr/sbin/tmpwatch -umc 6 /var/tmp &&
/usr/sbin/tmpwatch -umc 12 /var/cache/eaccelerator

if [ $? = 0 ];
then
echo "$(date) Tmp purge completed successfully with error code: $?.  " >> /home/username/logs/TmpPurge.log
else
echo "$(date) Tmp purge exited with error code: $?.  " >> /home/username/logs/TmpPurge.log
fi
echo -e "\r" >> /home/username/logs/TmpPurge.log

クロンジョブ:

20 3 * * * /bin/sh /home/username/scriptsdir/TmpPurge.sh > /home/username/logs/TmpPurge.log 2>&1

質問 1: スクリプトは正しいですか? 質問 2: 複数のコマンドを実行する最良の方法は何ですか? 上記でしょうか、それとも

find /home/username/sessions -iname 'sess_*' -mmin +480 -exec rm -rf {} \;
find /home/username/sessions -iname 'sess_*' -mmin +240 -exec rm -rf {} \;
/usr/sbin/tmpwatch -umc 5 /home/username/sessions;
/usr/sbin/tmpwatch -umc 6 /var/tmp;
/usr/sbin/tmpwatch -umc 12 /var/cache/eaccelerator

また

/usr/sbin/tmpwatch -umc 5 /home/username/sessions\%
/usr/sbin/tmpwatch -umc 6 /var/tmp\%
/usr/sbin/tmpwatch -umc 12 /var/cache/eaccelerator\%
4

2 に答える 2

1

最初の方法は、コマンドを で連結したもの&&で、最初のエラーで停止し、そのエラーを報告します。セミコロンを使用する場合;(各コマンドを新しい行に置くと、実際には不要です)、それらのいずれかが失敗したかどうかに関係なく、それらはすべて実行され、if [ $? -eq 0 ]チェックは最後のコマンドがエラー。だから私はそれがあなたが望むものだとは思わない。

if [ $? -ne 0 ]または、各コマンドの後にチェックを追加することもできます。おそらく、最も明確で最も理解しやすいものを試してみてください。

また、cron ジョブを使用して tmp を消去するとマルチユーザー システムの場合は危険な場合がありfindます。誰かが、あなたが見ることができる優れた安全なコードを持っている可能性があります。-exec rm -rf {}

于 2012-09-20T23:12:12.973 に答える
1

エラーをチェックする別の方法は、「||」を使用することです。オペレーター

 command || exit 1    # Will exit with return code 1 if command fails

アイデアは簡単です:

&& と || コマンドを連結するために使用されます (コマンドを分離するために使用される ";" とは異なります)。

&& は AND 演算子です。つまり、後続の各コマンドは、前のコマンドが成功した場合にのみ実行されます (0 で終了)。

|| OR 演算子です。つまり、後続の各コマンドは、前のコマンドが失敗した場合にのみ実行されます (0 以外の値で終了します)。

; コマンド (またはコマンド チェーン) を終了するために使用されます。行が突然終了した場合、シェル (少なくとも私が知っているほとんどのシェル) は、行が ; で終了したと見なします。これを望まない場合は、\ で行を終了する必要がありますが、シェルは行を 1 つの行として実行する前に結合します。

また、これらを一緒にチェーンできることにも注意してください。

 echo a && echo b && ls /dir/doesnt/exist && echo c; echo d || echo e; ls /dir/doesnt/exist || echo f

印刷します:

 a
 b
 d
 f

また、さまざまな && と || を左結合の方法で混在させることもできることに注意してください。

 echo a && ls /dir/doesnt/exist || echo b

プリント:

 a
 b
于 2012-09-20T23:20:31.717 に答える