1

私はこのようなコードを持っています:

set -e
set -x
folderName=$(echo `date +%Y/%m/%d/`);
fileName=x.x.x.x.x.x.x.log 
cp x.x.x.x.x.x/$1 $fileName  
gzip $fileName  
s3cmd put $fileName.gz s3://x.x.x.x.x/$folderName    
rm $fileName.gz

私がこのように実行した場合、これは正常に機能しています:

./shell logfilelocation

そして、私がこのようにcrontabに追加したとき:

* * * * * /home/x.x.x/testing/s3 -f x.x.x.log >> /tmp/mys3Log

そして待った!ファイルmys3Logが作成されます。しかし、それには内容がありません!コマンド実行の結果(set -e ; set -xコードで使用したように)は、mys3Logそこでリダイレクトを行っているので、ファイルに入るはずです。

しかし、何かがうまくいかない。私はbashプログラミングとcronに非常に慣れていません。

どこで間違いを犯しているのですか?

前もって感謝します。

4

2 に答える 2

2

cronインタラクティブシェルのように同じ環境を持っていないので、スクリプトの最初のシェバンの後に、次のように追加します。

source ~/.bashrc || source /etc/profile

そして、set -e何が起こっているかを確認するために削除します。

で、crontabエラーと出力(STDERRSTDOUT)をログに記録するには、次のことを行う必要があります。

* * * * * /home/x.x.x/testing/s3 -f x.x.x.log >> /tmp/mys3Log 2>&1

さらに、スクリプトの4行目では、$name宣言されていない変数を使用しています。

最後になりましたが、Janauaryが言ったよう#!/bin/bashに、最初の行にshegangを追加し、スクリプトに実行可能権限があることを確認してください。:chmod +x script.sh

于 2012-10-12T11:26:34.457 に答える
0

前の回答で述べたように、cronはシェルとは異なる環境で動作します。これは、環境変数がシェルで異なることを意味します。例:

シェル内:

$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin

一方、cronで以下を実行する場合:

* * * * * echo $PATH > path.out

あなたが得るでしょう/usr/bin:/bin

コマンドを使用してs3cmd実行可能ファイルがどこにあるかを調べwhich s3cmd、それに応じてcronを変更します。例えば:

$ which s3cmd
/usr/local/bin/s3cmd

次に、cronは次のようになります。

PATH=/usr/bin:/bin:/usr/local/bin
* * * * * echo $PATH > path.out
于 2015-11-30T21:27:28.687 に答える