バックグラウンド
ローカル サーバー スクリプトを管理する Alfred ワークフローを作成しました。これは基本的に、特定の URL を呼び出してアクションを実行するミニ HTTP サーバーです。ワークフローは次のようになります。
スクリプト フィルターは、選択するアクションのリストを取得するためだけに、静的 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>
ご覧のとおり、シェル コマンドはarg
属性の内部にあり、エントリを選択するときにワークフローの次のステップに渡されます。
エスケープも追加コマンドもありません。スクリプト フィルターからの出力を取得し、シェルで実行するだけです。
は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 呼び出し) を介して再度シャットダウンすることはできません。
何が機能するか(毎回同じスクリプトとコマンドを使用):
- アルフレッドから始めて、シェルでストップ。
- シェルから開始し、Alfred で停止します。
- そしてもちろん、シェルから開始および停止します。
作成された PID ファイルを介して、Alfred から起動したときにサーバーが実行されていることがわかります。また、Alfred を介して停止しようとすると、PID ファイルがまだそこにあり、プロセスがアクティブなままであることもわかります。
Alfred を介してサーバーを起動するたびに、Alfred からの後続の呼び出しをリッスンしないようです。
Alfred ではデバッグがかなり制限されているため、ヒントや提案をいただければ幸いです。