2

PHP スクリプト (beanstalkd のワーカー) を実行するシェル スクリプトがあります。

スクリプトは次のとおりです。

#!/bin/bash

if [ $# -eq 0 ]
then
   echo "You need to specify an argument"
   exit 0;
fi

CMD="/var/webserver/user/bin/console $@";
echo "$CMD";
nice $CMD;
ERR=$?

## Possibilities
# 97    - planned pause/restart
# 98    - planned restart
# 99    - planned stop, exit.
# 0     - unplanned restart (as returned by "exit;")
#        - Anything else is also unplanned paused/restart

if [ $ERR -eq 97 ]
then
   # a planned pause, then restart
   echo "97: PLANNED_PAUSE - wait 1";
   sleep 1;
   exec $0 $@;
fi

if [ $ERR -eq 98 ]
then
   # a planned restart - instantly
   echo "98: PLANNED_RESTART";
   exec $0 $@;
fi

if [ $ERR -eq 99 ]
then
   # planned complete exit
   echo "99: PLANNED_SHUTDOWN";
   exit 0;
fi

スクリプトを手動で実行すると、次のようになります。

[user@host]$ ./workers.sh

完全に機能しています。PHP スクリプトの出力を確認できます。しかし、次のようにコンソールからプロセスを切り離すと:

[user@host]$ ./workers.sh &

もう機能していません。ただし、バックグラウンドでプロセスを見ることができます。

[user@host]$ jobs
[1]+  Stopped                 ./workers.sh email

キュー ジョブ サーバーがジョブでいっぱいになり、次のように分離されたスクリプトをフォアグラウンドに移動するまで、それらのジョブは処理されません。

[user@host]$ fg

この時点で、すべてのジョブが PHP スクリプトによって処理されていることがわかります。なぜこれが起こっているのか分かりません。助けていただけますか?

ありがとう、マキシム

編集:

x ワーカーを実行するシェル スクリプトを作成しました。ここで共有します。それが最善の方法かどうかはわかりませんが、現時点ではうまく機能しています:

#!/bin/bash

WORKER_PATH="/var/webserver/user/workers.sh"
declare -A Queue
Queue[email]=2
Queue[process-images]=5

for key in "${!Queue[@]}"
do
  echo "Launching ${Queue[$key]} instance(s) of $key Worker..."
  CMD="$WORKER_PATH $key"
  for (( l=1; l<=${Queue[$key]}; l++ ))
    do
        INSTANCE="$CMD $l"
        echo "lnch instance $INSTANCE"
        nice $INSTANCE > /dev/null 2> /dev/null &
    done
done
4

1 に答える 1

3

echoバックグラウンド プロセスは、スクリプトがステートメントで実行しようとする端末への書き込みを許可されていません。標準出力をバックグラウンドに置くときに、標準出力をファイルにリダイレクトするだけです。

[user@host]$ ./workers.sh > workers.output 2> workers.error &

(安全のために、標準エラーもリダイレクトしました。)

于 2012-07-27T00:53:51.670 に答える