Bash 为什么我的shell脚本在后台处于待机状态,直到我将其恢复到前台?

Bash 为什么我的shell脚本在后台处于待机状态,直到我将其恢复到前台?,bash,background-process,detach,Bash,Background Process,Detach,我有一个shell脚本,它正在执行一个php脚本(beanstalkd的worker) 以下是脚本: #!/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

我有一个shell脚本,它正在执行一个php脚本(beanstalkd的worker)

以下是脚本:

#!/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
[user@host]$ ./workers.sh &
[user@host]$ fg
它工作得很好,我可以看到我的PHP脚本的输出。 但如果我将进程从控制台分离,如下所示:

[user@host]$ ./workers.sh
[user@host]$ ./workers.sh &
[user@host]$ fg
它不再工作了。然而,我可以在后台看到这个过程

[user@host]$ jobs
[1]+  Stopped                 ./workers.sh email
[user@host]$ ./workers.sh > workers.output 2> workers.error &
队列作业服务器正在填充作业,在我将分离的脚本带到前台之前,不会处理任何作业,如下所示:

[user@host]$ ./workers.sh
[user@host]$ ./workers.sh &
[user@host]$ fg
此时,我看到所有作业都由我的PHP脚本处理。我不知道为什么会这样。你能帮忙吗

谢谢,马克西姆

编辑:

我已经创建了一个shell脚本来运行x workers,我在这里分享它。不确定这是最好的方法,但目前效果良好:

#!/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
#/bin/bash
WORKER_PATH=“/var/webserver/user/workers.sh”
声明-队列
队列[电子邮件]=2
队列[进程映像]=5
对于“${!队列[@]}”中的键
做
echo“正在启动$key Worker的${Queue[$key]}实例…”
CMD=“$WORKER\u PATH$key”
对于((l=1;l/dev/null 2>/dev/null)&
完成
完成

后台进程不允许写入终端,脚本试图用
echo
语句来完成此操作。将标准输出放到后台时,只需将其重定向到文件

[user@host]$ jobs
[1]+  Stopped                 ./workers.sh email
[user@host]$ ./workers.sh > workers.output 2> workers.error &

(为了安全起见,我也重定向了标准错误。)

谢谢你,伙计,你让我开心了!