シェルの「デーモン」機能を使用して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
とどのように相互作用するかという問題ですか?
どのシェルを使用していますか? 4月にシェル実行ファイルが変更されていないことを確認してください(新しいデフォルトシェルである/ usr/bin/bashから/ usr/bin/zshへ) –
いいえ、コードブロックを編集して、私たちはbashを使っています。私はちょうどチェックした。 zshはマシンにもインストールされていません。 – Jonathan