0

バックグラウンド

ローカル サーバー スクリプトを管理する 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 ではデバッグがかなり制限されているため、ヒントや提案をいただければ幸いです。

4

1 に答える 1

0

ようやく問題の原因を突き止めましたが、まだ完全には説明できません。

スクリプトの実行ステップは、スクリプトを順番に実行するように設定されています。curlへの呼び出しは瞬時に行われ、実際のスクリプトはnohupandで開始されたため、これが問題になるとは思っていませんでしたdisown。ただし、これら 2 つの追加のキーワードを使用しても、後続のコマンドの実行がブロックされるようです。

これは特にアルフレッドに関係があると思いますか?

スクリプトの実行設定

于 2016-03-22T13:30:18.367 に答える