crontabの$ RANDOMに関する問題


9

cronの$ RANDOMに奇妙な問題があります。cronjobが起動してからランダムな分数でコマンドを実行したいと思います。

この例は、ターミナルで直接動作し、コマンドを最大30秒遅らせます(コマンドを必要なものに置き換えてください。実際には、/ dev / ttyUSB0へのエコーです)。

sleep `expr $RANDOM \% 30` ; command

同じ行がcrontabに配置されている場合、コマンドは常に遅延なしですぐに実行されます。

* * * * * sleep `expr $RANDOM \% 30` ; command

$ RANDOMなしの式を使用すると、正常に機能します。これにより、15秒の遅延が生じます。

* * * * * sleep `expr 10 + 5` ; command

つまり、$ RANDOMはcronでは機能しないようです。

しかし、これは$ RANDOM自体がゼロに評価されるという単純な理由ではありません。これにより、遅延が10になるはずです。

* * * * * sleep `expr $RANDOM \% 30 + 10` ; command

&&も試してみました; しかし、それは役に立ちません。実際、コマンドはまったく実行されません!

もちろん、その後crontabから呼び出されるスクリプトに遅延を設定することもできますが、これは私の問題を説明せず、私に学習させることもありません:-)

それが違いを生むのは、Debian Lennyです。

回答:


17

cron/bin/shシェルを使用してタスクを実行します。一部のディストリビューションでは、これはへのシンボリックリンクdashです。どちらも$RANDOM、- bash固有の拡張である変数をサポートしていません。

  • vixie-cronを使用するSHELL=/bin/bashと、crontabの上部に行を追加できます。

  • それ以外の場合は、bash -c 'echo $RANDOM'またはで解決する必要がありperl -e 'print int(rand(65535))'ます。

    (上記の例では、返される最大数は65535です。スクリプト内で他の数式を適用することもできます。)

  • 適切に構成されたシステムでは、このことcron自体が通知されます。エラーメッセージを含むジョブ出力は常に電子メールで送信されます。軽量MTAをインストールします。


また、bashでは$(( ))が優先され`expr`ます。


最後に確認し/bin/shたのは、実際のシェルではなく、Debianのsysadminの優先シェル(通常はbashまたはdash)へのシンボリックリンクでした。
Hello71、2011年

1
@ Hello71:これは私が投稿で言ったことです。それでも、システムソフトウェアが起動するのは慣例です/bin/sh(Bourneシェルと互換性があることを期待しています)。例はsystem()glibc の関数です。したがって/bin/sh、通常は最速の Bourne互換シェルを指します。そしてシステム管理者は、システム全体のその優先を強制しないように、/ etc / passwdファイルの適切な行に彼の好みを設定することになっている
user1686

@ Hello71:...そう、主に私が投稿で言ったこと。(私は他のほとんどのディストリビューションがにリンクshしていることを知っていますがbash、関連性がないようです。)
user1686

あなたは正しい、/bin/shダッシュを指します。今まで、ダッシュについて聞いたことがありません。私はそれを調べたところ、bashの軽量版です。また、cronが「機能不全」の環境で実行されることは知りませんでしたが、これは、私が過去に経験した他のさまざまな問題を説明しています。ところで、私は使い始めました$(())が、うまくいかなかったので、あらゆる種類のバリエーションを試しましたが、結局expr、どちらもうまくいきませんでした。しかし、それが私が終わったところです:-)を使用して制限なしで通常のbashシェルを実行することは可能bash -c 'xxxx'ですか?ところで、コメントに改行を入れることはできませんか?
marlar

@marlar:1)dashはシェルです。それは多かれ少なかれ正常ではありませんbash。それもその変形ではありません。2)回答のポイント1と2を参照してください。
user1686 2011年

2

cron通常、「完全」ではない環境で実行されます。つまり、同じ環境変数の多くが利用できないだけです。明らか$RANDOMにそのようなものの1つであり、実際にsleepは、未定義の変数が原因でコマンドがエラーで失敗しているだけ&&です;。(実際に$RANDOMは、Bash関数ですがcron、完全なBash環境では動作しないため、明らかにこの関数が不足しています。)

このタスクを実行するには、先ほど述べたように、別のBashスクリプトを使用する必要があります。または、コマンドでcat /dev/urandom直接使用する方法を理解できる場合もありますがcron、おそらく現在持っているものを別のBashスクリプトに移動する方が簡単でしょう。


1
それはきれいではありませんが、あなたの提案に類似しているこの解決策を見つけました:sleep $(expr od -An -N1 -i /dev/urandom\%30); コマンド
marlar

1
$RANDOM一部の「完全な」環境の一部ではありません。プロセスの開始時に設定される環境変数とは関係ありません。これは、bashで「その場で」作成される特別な変数です。その新しい値は、変数が読み取られるたびに常に生成されます。--- cronデフォルトで使用される/bin/shので、に/bin/shリンクされていないシステムでは、デフォルトでは機能しませんbash $RANDOM
pabouk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.