【问题标题】:Allow commands to run after backgrounding django runserver command in a bash script?允许在 bash 脚本中后台运行 django runserver 命令后运行命令?
【发布时间】:2015-07-26 02:27:57
【问题描述】:

我正在编写一个“简单”脚本来启动 django 服务器,在后台启动它,然后在我开发时启动 firefox。

我见过</dev/null & 技巧,它可以在命令行上运行。但是当我在我的脚本中使用它时,它仍然挂在启动的服务器上。使用 ctrl-zbg 命令进行后台处理只会使脚本后台运行,而不是命令。

有没有办法可以将 django 传递给“不要占用输入”标志?或者我可以在脚本中以某种方式将其作为背景,而不是将& 放在它的末尾?或者只是告诉脚本不要在单独的会话中运行它?

这是我的完整脚本(它充满了硬核丑陋,如果我可以让它工作,它可能会得到美化):

SETTING_ENV=$1
if [ "$PWD" = "/home/$USERNAME/PROJECT/" ]; then
    pid=$(for pid in $(pidof -x "python"); do ps -p $pid -o pid,cmd --no-heading; done| grep [m]anage|head -1|cut -d" " -f2)
    if [ -z $pid ]; then
        python ./manage.py runserver --settings=project.settings.$SETTING_ENV < /dev/null &
    else
        echo "Server still running on : $pid"
    fi
    pids=$(pidof -x firefox)
    for pid in $pids; do
        echo $pid
        if [ -z $pid ]; then
             echo "starting firefox"
             firefox --new-window localhost:8000 &
        else ecjp "Firefox already running on pid: $pid"
        fi
    done
else
    echo "$PWD is not /home/$USERNAME/PROJECT";
fi

【问题讨论】:

  • 我可以检查这些更新来自有类似问题的人吗?这听起来应该有一个简单的解决方案 - 没有很多支持?

标签: python django bash backgrounding


【解决方案1】:

您可以像这样将所有命令放在括号中:

(python ./manage.py runserver --settings=project.settings.$SETTING_ENV < /dev/null &)

当您在括号之间运行命令时,它将创建一个新的子 shell,因此当您退出 shell 时,该命令将继续运行。

或者你也可以使用 disown 或 nohup :

python ./manage.py runserver --settings=project.settings.$SETTING_ENV < /dev/null & 
disown

-

nohup python ./manage.py runserver --settings=project.settings.$SETTING_ENV < /dev/null &

【讨论】:

  • 这些(在本例中)都没有将控制权交还给脚本。我已经使用了您在其他地方提到的所有三种方法,我知道它们通常有效。在disown 的情况下,当我杀死./manage runserver 的进程时输出:./start_gui.sh: line 21: 4932 Terminated python ./manage.py runderver --settings=project.settings.$SETTING_ENV &lt; /dev/null
猜你喜欢
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2019-09-02
  • 2014-04-09
  • 2021-06-19
  • 1970-01-01
相关资源
最近更新 更多