0

背景

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

工作流程

脚本过滤器来自一个静态 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在选择条目时,该属性将传递到工作流程中的下一步。

运行脚本步骤尽可能简单: 运行脚本

没有转义,没有额外的命令……它只是从 Script Filter 获取输出并在 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 调用)。

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

  • 从 Alfred 开始,通过 shell 停止。
  • 从 shell 开始,通过 Alfred 停止。
  • 当然,从 shell 启动和停止它。

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

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

Alfred 中的调试相当有限,因此我们将不胜感激任何提示/建议!

4

1 回答 1

0

我终于找到了导致问题的原因,但还不能完全解释它。

运行脚本步骤设置为按顺序运行脚本。我没想到这会成为一个问题,因为对的调用是即时的,并且实际的脚本是以andcurl开头的。但是,似乎即使使用这两个附加关键字,它仍然会阻止执行任何后续命令。nohupdisown

我认为这是与阿尔弗雷德特别相关的东西?

运行脚本设置

于 2016-03-22T13:30:18.367 回答