为啥我的 shell 脚本在后台处于待机状态,直到我把它带回前台?

Posted

技术标签:

【中文标题】为啥我的 shell 脚本在后台处于待机状态,直到我把它带回前台?【英文标题】:Why my shell script is in standby in the background till I bring it back on the foreground?为什么我的 shell 脚本在后台处于待机状态,直到我把它带回前台? 【发布时间】:2012-07-27 00:29:08 【问题描述】:

我有一个 shell 脚本,它正在执行一个 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 脚本正在处理所有工作。我不知道为什么会这样。请问您能帮忙吗?

谢谢,马克西姆

编辑:

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

#!/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

【问题讨论】:

【参考方案1】:

不允许后台进程写入终端,您的脚本尝试使用echo 语句来执行此操作。当你把它放到后台时,你只需要将标准输出重定向到一个文件。

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

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

【讨论】:

谢谢伙计,你让我开心!

以上是关于为啥我的 shell 脚本在后台处于待机状态,直到我把它带回前台?的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本监控LVS后台服务器存活状态

shell 判断后台是不是有任务执行 fg

如何检查系统是不是处于待机模式?

我们如何检查iphone是不是处于待机模式?

为啥shell脚本exit后,当前进程没有终止?

运行脚本并在 SSH 断开连接(如管道损坏)后使其处于活动状态,而无需在后台强制它