9

これは常に私に起こり続けます:1)スクリプト(ルビー、シェルなど)を書きます。2) 実行すると動作します。3)crontabに入れて数分で実行されるようにして、そこから実行されることを確認します。4) ステップ 2 または 3 に 1000 回戻ることはありません。エラー トレースはありません。

Ruby スクリプトが crontab で失敗すると、次のように出力をパイプすると失敗する理由がよくわかりません。

ruby script.rb >& /path/to/output

スクリプトの出力はある程度取得できますが、スクリプトからのエラーは表示されず、bash からのエラーも表示されません (ルビーが見つからない場合やファイルが存在しない場合など)。

どの環境変数が設定されているのか、それが問題なのかどうかはわかりません。crontab から ruby​​ スクリプトを実行するには、大量の環境変数をエクスポートする必要があることがわかりました。

ターミナルから自分で実行したかのように、crontab にスクリプトを実行させる方法はありますか?

デバッグ時には、タイマーをリセットして待機状態に戻る必要があります。非常に時間がかかります。

crontab で物事をよりよくテストする方法、またはこれらの問題を回避する方法は?

4

6 に答える 6

7

「ターミナルから自分でスクリプトを実行したかのように、crontab にスクリプトを実行させる方法はありますか?」

はい:

bash -li -c /path/to/script

マニュアルページから:

[vindaloo:pgl]:~/p/test $ man bash | grep -A2 -m1 -- -i
   -i        If the -i option is present, the shell is interactive.
   -l        Make bash act as if it had been invoked as a login shell (see
             INVOCATION below).
于 2009-08-12T15:24:43.367 に答える
6

こんばんは

cron の基本的な問題の 1 つは、cronによって最小限の環境が設定されることです。実際、env は 4 つしか取得できません。var のセットであり、それらは次のとおりです。

  • シェル - /bin/sh に設定
  • LOGNAME - /etc/passwd にあるユーザー ID に設定します
  • HOME - ホーム ディレクトリに設定します。/etc/passwd にある
  • PATH - 「/usr/bin:/bin」に設定

それでおしまい。

ただし、できることは、必要な環境のスナップショットを作成し、それをファイルに保存することです。

次に、cronjob ソースを、この環境をソースとする簡単なシェル スクリプトにします。ファイルを作成し、Ruby スクリプトを実行します。

ところで、ラッパーソースを共通の環境に持っています。ファイルは、複数の cronjobs に対して一貫した環境を強制する優れた方法です。これにより、DRY 原則も強制されます。これにより、必要に応じて更新するための 1 つのポイントが得られるため、たとえば、ログの場所が変更されたり、別のユーティリティが使用されたりした場合に、一連のスクリプトを検索して特定の文字列を検索する必要がなくなります。たとえば、vanilla tar の代わりに gnutar が使用されています。

実際、この手法は、いくつかの主要な世界の航空会社に共通する主要なソフトウェア プロジェクトの継続的統合を実装するために使用される Build Monkey で非常にうまく使用されています。3,500kSLOC が 1 日に数回チェックアウトおよびビルドされ、8,000 以上の回帰テストが 1 日に 1 回実行されます。

HTH

「アヴァハッピー、

于 2009-08-15T16:01:43.790 に答える
3

ruby スクリプト内から「set」コマンドを実行し、crontab から起動すると、何が設定されていて何が設定されていないかを正確に確認できます。

于 2009-08-12T12:59:11.373 に答える
2

cronがジョブを実行する環境を見つけるには、次のcronジョブを追加します。

{ echo "\nenv\n" && env|sort ; echo "\nset\n" && set; } | /usr/bin/mailx -s 'my env' you@example.com

または、出力を電子メールではなくファイルに送信します。

于 2009-08-12T16:08:47.507 に答える
1

たとえばrbcron、次のようなラッパー スクリプトを作成できます。

#!/bin/bash
RUBY=ruby
export VAR1=foo
export VAR2=bar
export VAR3=baz

$RUBY "$*" 2>&1

これにより、標準エラーが ruby​​ から標準出力にリダイレクトされます。次に、cron ジョブを実行するrbcronと、標準出力に ruby​​ の out+err が含まれますが、rbcron 自体から存在する「bash」エラーも含まれます。cron エントリで、リダイレクト2>&1 > /path/to/outputして出力 + エラー メッセージを取得し、/path/to/output に移動します。

于 2009-08-12T12:44:12.923 に答える
1

本当に自分自身.profileで実行したい場合は、 /などをソースとするシェルスクリプトから ruby​​ を呼び出すことができます.bashrc。そうすれば、環境にプルされます。

ただし、欠点は、環境から分離されていないことです。これを変更すると、cron ジョブが突然機能しなくなる可能性があります。

于 2009-08-12T12:45:42.720 に答える