2

次のbashスクリプトがあります:

#!/bin/bash
src="/home/user/testingscript"
for dir in $(ls "$src")
do
find ${src}/${dir}/ -type f -mtime +31 delete
done

端末から実行すると問題なく動作しますが、一度crontabに入れると次のようになります。

* * * * * /bin/bash /home/user/script/mailboxclean.sh >> /home/user/mailboxcleanup.log 2>&1

またはとして:

* * * * * /home/user/script/mailboxclean.sh

それは実行されません。

スクリプトが実行されたことと、リダイレクトしているmailboxcleanup.logを除いて、syslogにフィードバックはありません。実際には役に立たない次のように表示されます。

/home/user/mailboxcleanup.log: 1: /home/user/mailboxcleanup.log: /bin/sh:: not found

何か案は?

ありがとう

4

1 に答える 1

1

スクリプトをどこに置くかによって異なります。

/etc/crontab 経由で実行したい場合: コマンドの前にユーザーを指定する 6 番目のパラメーターが必要です!

 * * * * * theuser /home/user/script/mailboxclean.sh

を使用して誰か(ルートまたはユーザー)のcrontabに配置すると、crontab -e

 * * * * * /home/user/script/mailboxclean.sh

(つまり、ユーザーが既知であるため、6 番目のパラメーターはありません)

/etc/cron.*/ の下に配置して毎日/毎週/毎月実行する場合は、拡張子を削除する (つまり、 と呼ぶmailboxclean) 必要があることに注意してください。そうしないと、単純に無視されます。

違いの最も一般的な原因は、cron 経由で実行した場合 (または /etc/cron.* ディレクトリの下に配置した場合)、スクリプトに環境変数がないことです...これを確認します (echo "=== set: ============ " ; set ; echo "=== env: ============ " ; envスクリプトの先頭に : を追加できます)たとえば、デバッグ中に. または、必要なものをすべて正しく設定していることを確認してください)


質問とは関係ありませんが、変更する必要があります

for dir in $(ls "$src"); do find ${src}/${dir}/ -type f ....

for dir in "${src}"/*/ ; do find "${dir}" -type f ....

(これに関する情報については、 http://mywiki.wooledge.org/BashPitfallsを参照してください。また、他の多くの情報も参照してください (bash スクリプトを学習すると、サイトの残りの部分も素晴らしいものになります))

于 2013-11-13T17:08:45.377 に答える