Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 捕获由Makefile启动的后台进程的PID_Shell_Makefile_Sh_Background Process - Fatal编程技术网

Shell 捕获由Makefile启动的后台进程的PID

Shell 捕获由Makefile启动的后台进程的PID,shell,makefile,sh,background-process,Shell,Makefile,Sh,Background Process,我有一个启动Django web服务器的Makefile。我希望服务器在后台启动,PID保存到一个文件中 我的食谱是这样的: run: venv @"${PYTHON}" "${APP}/manage.py" runserver 80 run: venv @"${PYTHON}" "${APP}/manage.py" runserver 80 & ; echo "$$!" > "${LOGDIR}/django.pid" 直观地说,为了给流程添加背景并捕获PID

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

我的食谱是这样的:

run: venv
    @"${PYTHON}" "${APP}/manage.py" runserver 80
run: venv
    @"${PYTHON}" "${APP}/manage.py" runserver 80 & ; echo "$$!" > "${LOGDIR}/django.pid"
直观地说,为了给流程添加背景并捕获PID,我必须执行以下操作:

run: venv
    @"${PYTHON}" "${APP}/manage.py" runserver 80
run: venv
    @"${PYTHON}" "${APP}/manage.py" runserver 80 & ; echo "$$!" > "${LOGDIR}/django.pid"
但这不管用。“make”使用的子shell(/bin/sh在我的例子中)在您使用以下命令时工作:

<command> &
&
…对流程进行后台处理,并在使用时起作用:

<command> ; <command>
(或
&&
等…)以链接命令。但是,当我尝试对第一个进程进行后台处理并链接第二个进程时,会出现以下错误:

/bin/sh:-c:第0行:意外标记“;”附近的语法错误

对进程进行后台处理并在Makefile中捕获PID的最佳方法是什么

谢谢

-B

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

只需留下一个符号,后面不带分号:

run: venv
    @"${PYTHON}" "${APP}/manage.py" runserver 80 & echo "$$!" > "${LOGDIR}/django.pid"
与分号相同,符号和用作命令分隔符:

<command> & <command>
&

我很好奇你为什么要用
make
来启动Web服务器?这是某种测试套件吗?祝你好运@Shedder:我正在开发一个web应用程序,我正在使用一个Makefile来提供一种快速启动本地web服务器的方法,用于开发和测试目的。这是可行的,但由于Makefile只是一组shell宏命令,我可能会在shell脚本中遇到同样的问题。那里的解决方案应该直接调整到makefile中,而不是添加另一层抽象和依赖项。True。很多时候,我会先尝试让它在shell脚本中工作,然后将它迁移到Makefile中。