2011-06-27 6 views
0

シェルの「デーモン」機能を使用してSinatraスクリプトを実行するスタートアップスクリプトで奇妙な問題が発生しました。問題は、コマンドラインでコマンドを実行するとSTDOUTに出力されることです。コマンドラインでコマンドを実行すると、スクリプトのように(デーモン部分を除いて)、出力が出力ファイルに正しくリダイレ​​クトされます。しかし、スタートアップスクリプトがそれを実行すると(下記参照)、私はSTDERRログにはものを取得しますが、STDOUTログには取得しません。スクリプトのRubyのバックグラウンドプロセスSTDOUTが空です

関連する行:今

#!/bin/sh 
# (which is and has been a symlink to /bin/bash 

# Source function library. 
. /etc/init.d/functions 

# Set Some Variables 
RUNAS="joeuser" 
PID=/var/run/myapp.pid 
LOG="/var/log/myapp/app-out.log" 
ERR_LOG="/var/log/myapp/app-err.log" 
APPLICATION_COMMAND="RAILS_ENV=production ruby /opt/myapp/lib/daemons/my-sinatra-app.rb -p 8002 2>>${ERR_LOG} >>${LOG} &" 

# Snip a bunch. This is the applicable line from the "start" case: 
daemon --user $RUNAS --pidfile $PID $APPLICATION_COMMAND &> /dev/null 

は、ファンキーな部品:

  • は、エラーログはSTDERRのリダイレクトを経由して正しくに書き込まれます。
  • >>と2 >>の順番を逆にすると、動作は変わりません。STDERRは正しくログされ、STDOUTは空です。
  • 出力ログが存在しない場合は、STDOUTリダイレクトによってファイルが作成されます。しかし、ファイルの長さは0のままです。
  • これはうまく機能しませんでした。ログディレクトリはlog-rotateによって維持されます。最近の「out」ログはすべて0です。古いものはそうではありません。それは4月にしばらく時間がかかったようです。ルビコードはそれ以後はいつでも変更されませんでした。どちらも起動スクリプトを実行しませんでした。

私たちは、このように3つの異なるサービスを実行しています。そのうち2つはルビデーモン(1つはsinatraを使用し、もう1つはバックグラウンドjavaプロセスです)です。これはRubyプロセスの両方で発生していますが、Javaプロセスでは発生していません。 Rubyで何か変わったのだろうか?

FTRには、ルビー1.8.5とRHEL 5.4があります。


私はもう少し探求しました。 daemon関数は大量のものですが、問題の重要な点は、runuserを使用してプログラムを実行することです。このコマンドは、基本的に次のようになります。

runuser -s /bin/bash - joeuser -c "ulimit -S -c 0 >/dev/null 2>&1 ; RAILS_ENV=production ruby /opt/myapp/lib/daemons/my-sinatra-app.rb -p 8002 '</dev/null' '>>/var/log/myapp/app-out.log' '2>>/var/log/myapp/app-err.log' '&'" 

私は、コマンドラインで(とし、線に沿ってどこかに追加しまっシングルティックなしの両方)まさにそれを実行して、私は正確に同じ変に行動w.r.t.を取得出力ログ。それで、これはルビー(?)がrunuserとどのように相互作用するかという問題ですか?

+0

どのシェルを使用していますか? 4月にシェル実行ファイルが変更されていないことを確認してください(新しいデフォルトシェルである/ usr/bin/bashから/ usr/bin/zshへ) –

+0

いいえ、コードブロックを編集して、私たちはbashを使っています。私はちょうどチェックした。 zshはマシンにもインストールされていません。 – Jonathan

答えて

0

変更#!/bin/sh -xを追加し、すべてがあなたの期待に応じて展開されていることを確認するために、シェバング:-)コメントに置くには長すぎます。また、ターミナルから実行すると、あなたの.bashrcファイルはソースから取得され、スクリプトから実行されるときは出力されません。環境が違うあなたの中にあるかもしれません。見つけるための一つの方法は、端末から、スクリプトと出力

  • env > env_terminal
  • env > env_script
  • diff env_terminal env_script

ハッピー狩猟のdiffからenvを行うことです...

+0

環境はほぼ同じです。私が見る唯一の違いは、問題を説明するものではありません。スクリプト内の2対1でのSHLVL = 1です(期待通り)。次のページ: '-x'メッセージが教えてくれるものを見てください。 – Jonathan

関連する問題