Crontabを使用して画面を作成/再起動し、コマンドを実行するのに問題があります。

Crontabを使用して画面を作成/再起動し、コマンドを実行するのに問題があります。

特定のスクリプト(レールレイクジョブ)が常に私のサーバーで実行されるようにしたいです。これはデフォルトで私のデータベースをライブフィードで埋めます。画面を作成できます(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_environmentcronジョブを読むことも可能です。これはシェルスクリプトではないことに注意してください。~/.pam_environment制限された構文のみサポート

thatが利用できない場合は、明示的に読み取ることができ.pam_environmentます.profile

 * * * * * . ~/.profile && ./my-script

エラーは画面ウィンドウ内で発生し、その後すぐに画面が閉じるため、エラーは表示されません。通話-Lにオプションを追加します。これが発生した場合に備えて、レイクの出力を画面に記録するように指示することをお勧めしますscreenlogfile.screenrc

おすすめ記事