2017-01-07 8 views
1

私はこのコードを持っている:LaunchAgent plistからバックグラウンドでファイルを実行しますか?

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>Label</key> 
    <string>updater.Keychain.plist.sh</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>bash</string> 
     <string>-c</string> 
     <string>/Users/qwe/Music/meta.sh</string> 
     <string>/Users/qwe/Music/seta.sh</string> 

    </array> 
    <key>RunAtLoad</key> 
    <true/> 
</dict> 
</plist> 

事は「meta.sh」は、特定の何かが起こっているので、「seta.sh」決して実行されていないかどうか、すべての5秒をチェックし終わることのないスクリプトがあるということです。これを端末iで行うと、単純に&シンボルを使用してファイルをバックグラウンドで実行させることができますが、ファイル名の最後に&amp;を試してみましたが、実際には機能しませんでした。誰でも私を助けてくれる?ありがとう!!

+3

'seta.sh'は実行されません。なぜなら、' meta.sh'は決して終了するのではなく、単に 'meta.sh'によって見られる' $ 0'の値を設定するために使われる 'bash'のもう一つの引数です。 。 – chepner

+0

それで、meta.shが終わりのないコマンドだったらどうしますか?しかしsetaはまだファイルだった –

答えて

0

chepnerさんのコメントはすぐに問題になります。スクリプト名を間違ってbashに渡しています。 -cオプションの後では、bashはコマンドを含む単一の引数が必要です(オプションで引数に続いて、$0で始まります)。複数のコマンドを実行する場合は、それらを1つの複合コマンド(例えば、/Users/qwe/Music/meta.sh & /Users/qwe/Music/seta.sh)に結合する必要があります。

でも、あなたは打ち間違いをしていると思います。 Launchdは実際にプロセスを起動して監視することを意図しています。これは彼らが前景にとどまることを必要とする。打ち上げ時に自分自身の背後にあるものは、それを混乱させる傾向があり、奇妙な問題につながります。たとえば、上記のコマンド文字列を考えてみましょう。これはバックグラウンドでmeta.shを実行し、フォアグラウンドでseta.shを実行します。 meta.shは長時間実行されていると言いましたが、seta.shは仕事をして終了すると思いますか?そうであれば、launchdはseta.sh(フォアグラウンドプロセス)が終了したことを知り、サブプロセス(meta.sh)は孤立したままであり、 "クリーンアップ"する必要があります。 meta.shはもはや長時間走っていません。

meta.shとseta.shの両方を起動したい場合は、2つの独立した起動項目(2つの.plistファイル)を作成する方がよいでしょう。

何らかの理由でそれらを一緒に実行する必要がある場合は、基本的に、の両方を実行する小さなスクリプトを作成し、を終了し、その "スクリプト"をbashに渡すのを待ちます-cオプションのパラメータ。

<key>ProgramArguments</key> 
<array> 
    <string>bash</string> 
    <string>-c</string> 
    <string>/Users/qwe/Music/meta.sh &amp; /Users/qwe/Music/seta.sh; wait</string> 
</array> 

する別の可能性がある.plistにAbandonProcessGroupキーを追加し、「スクリプト」を持たないことであろう待つ:これは全体の「スクリプト」を意味することに注意してくださいProgramArguments配列内の単一stringにしておく必要があります

<key>ProgramArguments</key> 
<array> 
    <string>bash</string> 
    <string>-c</string> 
    <string>/Users/qwe/Music/meta.sh &amp; /Users/qwe/Music/seta.sh</string> 
</array> 
<key>AbandonProcessGroup</key> 
<true/> 

...しかし、これはlaunchdのが残され、バックグラウンド・プロセスがあります実現していない、といくつかの状況下では、それは2で、その結果、ジョブを再実行しようとするかもしれないという欠点があります:バックグラウンド・プロセスが終了するのを(またはそれ以上の)バックグラウンドプロセス...

+0

うわー、感謝の男!!私はあなたを理解していますが、ファイルの代わりに2つの異なるコマンドがあり、最初のコマンドは、ユーザーが手動でコマンドを終了するまで、決して終わらないコマンドでも、2つの異なるplists?ありがとう! –

+0

&のような2つのエスケープ文字はありません '&'? –

+0

@SUhost:ああ、私は '&'をコード化する必要があります。私はそれを修正します。他の質問については...私はあなたが達成しようとしていること、プログラムが何であるか、お互いの関係を推薦するためにもっと知る必要があります。ところで、コマンドは本質的に同時に実行されるので、どのコマンドが「最初」であるかは本当に問題ではありません。 –

関連する問題