当进程以disown

时间:2016-03-22 10:36:57

标签: bash shell alfred

背景

我创建了一个Alfred工作流来管理本地服务器脚本。它基本上是一个迷你HTTP服务器,通过调用特定的URL来执行操作。这就是工作流程的样子:

workflow

脚本过滤器来自静态XML文件,只是为了获取可供选择的操作列表:

<?xml version='1.0'?>
<items>
    <item arg='./start_server.sh'>
        <title>Start server</title>
    </item>
    <item arg='/usr/bin/curl -s "http://127.0.0.1:7070/start"'>
        <title>Start downloader</title>
    </item>
    <item arg='/usr/bin/curl -s "http://127.0.0.1:7070/stop"'>
        <title>Stop downloader</title>
    </item>
    <item arg='/usr/bin/curl -s "http://127.0.0.1:7070/shutdown"'>
        <title>Shutdown server</title>
    </item>
</items>

如您所见,shell命令位于arg属性内,在选择条目时会将其传递给工作流程的下一步。

“运行脚本”步骤尽可能简单: Run Script

没有转义,没有其他命令......它只是从脚本过滤器获取输出并在shell中执行它。

start_server.sh有点特殊,因为:

  • 服务器是一个Python脚本,它取决于要激活的virtualenv。
  • 因为它是服务器,所以子进程必须与Alfred断开连接,因此它会一直在后台运行。

start_server.sh脚本的内容:

#!/bin/bash
source $HOME/Development/virtualenv/alfred/bin/activate
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

nohup python traffic_server.py & disown

问题

每当通过Alfred启动服务器(Python脚本)时,我都无法通过Alfred(通过cURL进行HTTP调用)再次关闭它。

的作用(每次使用相同的脚本和命令):

  • 从阿尔弗雷德开始,穿过贝壳。
  • 从shell开始,停止通过Alfred。
  • 当然,从壳开始和停止它。

我可以告诉服务器在从Alfred启动时通过创建的PID文件运行。我还可以看到,当我尝试通过Alfred停止它时,PID文件仍然存在并且该过程保持活动状态。

似乎每当我通过Alfred启动服务器时,它都不会收听来自Alfred的任何后续调用。

Alfred的调试相当有限,所以任何提示/建议都会受到赞赏!

1 个答案:

答案 0 :(得分:0)

我终于找到了造成这个问题的原因,但却无法完全解释它。

“运行脚本”步骤设置为按顺序运行脚本。我并不认为这是一个问题,因为对curl的调用是即时的,而实际的脚本是以nohupdisown开始的。但是,即使使用这两个额外的关键字,它仍然会阻止执行任何后续命令。

我认为这与Alfred特别相关?

Run Script settings