
特定のスクリプト(レールレイクジョブ)が常に私のサーバーで実行されるようにしたいです。これはデフォルトで私のデータベースをライブフィードで埋めます。画面を作成できます(http://linux.die.net/man/1/screen)ジョブを簡単に実行しますが、失敗または停止した場合に備えて自動化したいと思います(本番環境に展開するたびに停止します)。
私はこれを完璧に実行するスクリプトを作成しました。
# my_script
#!/bin/bash
start_myscreen () {
screen -dmS myscreen bash -c 'cd /var/app/current/; rake my_task RAILS_ENV=production'
}
if screen -list | grep -q "No Sockets found"; then
echo "no screens available"
echo "starting myscreen"
start_myscreen
else
echo "screens available!"
if screen -list | grep -q "myscreen"; then
echo "myscreen exists - restarting"
screen -X -S myscreen quit
else
echo "myscreen does NOT exist - creating now"
fi
start_myscreen
echo "Finished!"
fi
これは、何があってもスクリプトが完了すると、画面「myscreen」がレイク操作を開始するように設計されています。明らかに、本番環境では毎分スクリプトを実行しません。これは現在のテスト用です。スクリプトは、以下を介して端末で実行されると完全に実行されます。
./my-script
この非常に単純なcrontabを使用して実行すると問題が発生します。
* * * * * ./my-script
奇妙なことは、スクリプトがすべてを正しく出力することです(crontabから私に電子メールで送信されたものに応じて)。ただし、スクリプトを実行すると、cronの実行後に実行される画面はまったく表示されません。
screen -list
非常に奇妙な。
注 - サーバーは64ビットのAmazon Linux(Red Hatと思う)を実行しています。
助けてくれてありがとう。
答え1
まず、crontabの現在のディレクトリがホームディレクトリであることに注意してください。スクリプトのフルパスをcrontabに入力する必要があります。ただし、スクリプトが実行されているため、これは問題ではありません。
発生する可能性のある問題は、スクリプトに通常のセッションで設定された環境変数が必要であることです。 cronジョブは最小環境で実行され、ユーザージョブ.profile
はロードされません。
多くのシステムでは、~/.pam_environment
cronジョブを読むことも可能です。これはシェルスクリプトではないことに注意してください。~/.pam_environment
制限された構文のみサポート。
thatが利用できない場合は、明示的に読み取ることができ.pam_environment
ます.profile
。
* * * * * . ~/.profile && ./my-script
エラーは画面ウィンドウ内で発生し、その後すぐに画面が閉じるため、エラーは表示されません。通話-L
にオプションを追加します。これが発生した場合に備えて、レイクの出力を画面に記録するように指示することをお勧めしますscreen
。logfile
.screenrc