【问题标题】:Capturing the PID of a background process started by a Makefile捕获由 Makefile 启动的后台进程的 PID
【发布时间】:2012-02-27 13:07:18
【问题描述】:

我有一个启动 Django Web 服务器的 Makefile。我希望在后台启动服务器,并将 PID 保存到文件中。

我的食谱是这样的:

run: venv
    @"${PYTHON}" "${APP}/manage.py" runserver 80

直观地说,要后台处理进程并捕获 PID,我必须执行以下操作:

run: venv
    @"${PYTHON}" "${APP}/manage.py" runserver 80 & ; echo "$$!" > "${LOGDIR}/django.pid"

不过,这不起作用。 'make' 使用的子 shell(在我的例子中是 /bin/sh)在您使用时起作用:

<command> &

...后台进程,并在使用时工作:

<command> ; <command>

(或&lt;command&gt; &amp;&amp; &lt;command&gt; 等...)链接命令。但是,当我尝试将第一个进程置于后台并链接第二个进程时,出现以下错误:

/bin/sh: -c: line 0: syntax error near unexpected token `;'

使进程后台运行并在 Makefile 中捕获 PID 的最佳方法是什么?

谢谢
- 乙

【问题讨论】:

  • 我很好奇您为什么使用make 来启动网络服务器?这是某种测试套件吗?祝你好运!
  • @shelter:我正在开发一个 Web 应用程序,并且我正在使用 Makefile 来提供一种快速启动本地 Web 服务器的方法,用于开发和测试目的。

标签: shell makefile sh background-process


【解决方案1】:

如果 Make 给你带来太多麻烦,你总是可以让目标启动一个 sh 脚本;在该脚本中,启动进程、后台,然后将 pid 输出到文件。

【讨论】:

  • 这可以工作,但由于 makefile 只是一组 shell 宏命令,我可能会在我的 shell 脚本中遇到同样的问题。那里的解决方案应该直接适应makefile,而不是添加另一层抽象和依赖。
  • 是的。很多时候,我尝试先让它在 shell 脚本中运行,然后将其迁移到 Makefile 中。
【解决方案2】:

只留下一个 & 号,后面不加分号:

run: venv
    @"${PYTHON}" "${APP}/manage.py" runserver 80 & echo "$$!" > "${LOGDIR}/django.pid"

和号作为命令分隔符的作用与分号相同:

<command> & <command>

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2010-11-05
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    相关资源
    最近更新 更多