当进程以 disown 开始时,Alfred Workflow 中的奇怪问题
Strange issue in Alfred Workflow when process started with disown
背景
我创建了一个 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
属性内,在选择条目时该属性会传递到工作流程的下一步。
运行 脚本步骤尽可能简单:
没有转义,没有额外的命令......它只是从脚本过滤器中获取输出并在 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
问题
只要服务器(Python 脚本)通过 Alfred 启动,我就无法通过 Alfred(通过 cURL 的 HTTP 调用)再次关闭它。
的作用(每次使用相同的脚本和命令):
- 从阿尔弗雷德开始,到shell结束。
- 从 shell 开始,到 Alfred 为止。
- 当然还有从 shell 开始和停止它。
当从 Alfred 启动时,我可以通过创建的 PID 文件告诉服务器 运行。我还可以看到,当我尝试通过 Alfred 停止它时,PID 文件仍然存在并且进程保持活动状态。
似乎每当我通过Alfred启动服务器时,它都不会监听来自Alfred的任何后续调用。
Alfred 中的调试相当有限,因此我们将不胜感激任何提示/建议!
我终于找到了导致问题的原因,但还不能完全解释清楚。
运行 脚本步骤设置为 运行 脚本顺序。我没想到这会成为一个问题,因为对 curl
的调用是即时的,而实际脚本是从 nohup
和 disown
开始的。但是,似乎即使使用这两个附加关键字,它仍然会阻止执行任何后续命令。
我认为这是与阿尔弗雷德特别相关的东西?
背景
我创建了一个 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
属性内,在选择条目时该属性会传递到工作流程的下一步。
运行 脚本步骤尽可能简单:
没有转义,没有额外的命令......它只是从脚本过滤器中获取输出并在 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
问题
只要服务器(Python 脚本)通过 Alfred 启动,我就无法通过 Alfred(通过 cURL 的 HTTP 调用)再次关闭它。
的作用(每次使用相同的脚本和命令):
- 从阿尔弗雷德开始,到shell结束。
- 从 shell 开始,到 Alfred 为止。
- 当然还有从 shell 开始和停止它。
当从 Alfred 启动时,我可以通过创建的 PID 文件告诉服务器 运行。我还可以看到,当我尝试通过 Alfred 停止它时,PID 文件仍然存在并且进程保持活动状态。
似乎每当我通过Alfred启动服务器时,它都不会监听来自Alfred的任何后续调用。
Alfred 中的调试相当有限,因此我们将不胜感激任何提示/建议!
我终于找到了导致问题的原因,但还不能完全解释清楚。
运行 脚本步骤设置为 运行 脚本顺序。我没想到这会成为一个问题,因为对 curl
的调用是即时的,而实际脚本是从 nohup
和 disown
开始的。但是,似乎即使使用这两个附加关键字,它仍然会阻止执行任何后续命令。
我认为这是与阿尔弗雷德特别相关的东西?