launchdを取得してプログラムの引数を正しく読み取る


18

私が実行しようとしているコマンドがエラーになっているlaunchdスクリプトがあります(明らかにそれは言葉ではありません、現在です)、不適切な使用法を訴えています。

私が取得している特定のエラーは、システムログにダンプされたコマンドの使用テキストです。これから、コマンドのオプションではなく、plistの他の情報(コマンドへのパス、タイミングなど)が正しく解析されていると推測します。

コマンドの使用後、最後の1行があります。

18/11/2013 09:30:00.101 com.apple.launchd.peruser.501: (fake.lable.seti[33833]) Exited with code: 1

しかし、それは「エラーで終了しました」という意味です。

launchdがコマンドをオプションから分割し、manページでProgramArgumentsについて説明していることを知っています。

さて、私はexecvp(3)を読みましたが、私は賢明な人ではないので、皆さんにたくさんの質問をしています。

通常、端末からコマンドを実行すると、次のようになります。

/Library/Application\ Support/BOINC\ Data/boinccmd --host localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update

これは大丈夫です。

そして、LaunchAgent plistのProgram / ProgramArgumentsセクションでこれを分割する方法は次のとおりです。

<key>Program</key>
    <string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
    <array>
        <string>--host localhost</string>
        <string>--passwd gobbledygook</string>
        <string>--project http://setiathome.berkeley.edu/ update</string>
    </array>

(記録のために、私はもともとboinccmdへのパスを\エスケープしましたが、それは機能しません、あなたのためにパス内のスペースをエスケープします)

引数をさらに分割してみました:

<key>Program</key>
    <string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
    <array>
        <string>--host</string>
        <string>localhost</string>
        <string>--passwd</string>
        <string>gobbledygook</string>
        <string>--project</string>
        <string>http://setiathome.berkeley.edu/</string>
        <string>update</string>
    </array>

しかし、それもうまくいかないようでした。

相変わらず、私はとても単純なものを見逃していると確信しています。

ありがとう。


回答:

ProgramArgumentsの最初の行は、プログラムへのパスである必要があります。これは私をつまずかせたものであり、確かに「...非常に注意深く読んでください!。」というコメントが意味するものです:)また、引数をコンポーネント部分に分割する必要がありました。すべてを準備しておけば、すべてが魅力的になります。どうもありがとうございました。

<key>Program</key>
    <string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
    <array>
        <string>/Library/Application Support/BOINC Data/boinccmd</string>
        <string>--host</string>
        <string>localhost</string>
        <string>--passwd</string>
        <string>gobbledygook</string>
        <string>--project</string>
        <string>http://setiathome.berkeley.edu/</string>
        <string>update</string>
    </array>

これがなぜそうなのかについてのわかりやすい説明のために言う最後の編集は、SirPavlovaの説明を参照してください。

〜W


launchctl list com.label.plistを使用すると、launchdがコマンドの正しい部分をつなぎ合わせていることがわかります。多分それは-に関連する問題だと思っていましたが、明らかにそうではありません。
ウッドジー

1
あなたの問題に対する答えはありませんが、最初の例<string>--host localhost</string>は間違いなく機能しません。コマンドラインをシェルに書き込むと、オプションの一部と通常の引数が分からないことに注意してください。実行中のプログラムに引数を渡すにスペースで分割するだけです。また、boinccmd報告している正確なエラーを表示する場合にも役立ちます。
ケビンリード

投稿を編集して、表示されている内容を伝えました。それが助けになるというわけではありません!また、オプションを空白で分割すると、同じエラーが発生します。私はそれが推測している-それは何とか問題を引き起こしている。
ウッドジー

1
私は両方ではないだけで、プログラムやProgramArguments使用しようとするだろう
user151019

回答:


19

Programキーを指定し、実行するファイル、およびProgramArgumentsキーは、実行中のプロセスに渡される引数を指定します。厳密に言えば、プロセスに任意の引数を渡すことができますが、慣例では、最初の引数はプロセスが呼び出された名前でなければならないため、ほとんどのプログラムは最初の引数を無視します。実行するファイルは明らかに必要な情報ですが、 Programキーが欠落している場合、launchdはProgramArguments 純粋に便宜上、最初の引数と同じ値を持つように見せかけます。

最初の例では、boinccmdを起動し、端末コマンドと同等の引数を指定します

--host\ localhost --passwd\ gobbledygook --project\ http://setiathome.berkeley.edu/\ update

boinccmdに「--host localhost」として呼び出し、2つの奇妙な引数のみを渡したことを伝えます。

2番目の例では引数を正しく分離していますが、Eddie Kelleyが前面に挿入する必要があると示唆したように。boinccmdに「--host」として起動したことを伝え、さらに6つの引数を渡します。boinccmdは、最後の5つを2つのオプションとして認識できますが、「localhost」ビジネスが何であるかはわかりません。boinccmdが知る限り、端末から次のように呼び出されました。

/Library/Application\ Support/BOINC\ Data/boinccmd localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update

(欠落している「--host」に注意してください)。

boinccmdはおそらく、最初の引数が何であるかを気にしないプログラムの大部分の1つであるため、実際<string>HELLO</string>にはProgramArguments配列の先頭に突き出すことができますが、Programキーを完全に削除してこれを使用する方がおそらくきれいです:

<key>ProgramArguments</key>
    <array>
        <string>/Library/Application Support/BOINC Data/boinccmd</string>
        <string>--host</string>
        <string>localhost</string>
        <string>--passwd</string>
        <string>gobbledygook</string>
        <string>--project</string>
        <string>http://setiathome.berkeley.edu/</string>
        <string>update</string>
    </array>

それは無意味な冗長のように見えるかもしれませんが、いくつかのプログラムはこれを有効に使用しています:bash et al。彼らの最初の引数で始まる場合はログインシェルとして機能し-、&その最初の引数がある場合Vimは様々なエミュレーションモードに入るedか、vi代わりにvim


1
メインの投稿を編集していたときに投稿しました!これは素晴らしい説明です。ありがとうございました。
ウッドジー

1
助けてくれてうれしい:)
サーパブロワ

@SirPavlova、大助かり!ただし、コンソール呼び出しをplist形式に変換するのに役立つツールはありますか?
gaussblurinc

6

exec(3)のmanページに基づいて、最初のプログラム引数は実行可能ファイルへのパスであるように思われます:

The execv(), execvp(), and execvP() functions provide an array of pointers to null-terminated strings
 that represent the argument list available to the new program.  The first argument, by convention,
 should point to the file name associated with the file being executed. The array of pointers must be
 terminated by a NULL pointer.

インデックス0の引数として実行可能ファイルへのパスを指定できる場合、役立つことがあります...


投稿を表示するように編集したので、boinccmdが見つかり実行されました。それに渡されるオプションは何らかの形でマングルされています。あなたが言っていることを見逃していない限り。
ウッドジー

1
@Woodgieはいプログラムで発見されたこと-あなたのProgramArguments imcorrectあり、それは実行可能ファイルのパス名必要
user151019

ああ。ああ!今見えると思う。ちょっと待って、レンメテスト。
ウッドジー

BINGO、それを実行し、各コマンドの各部分を独自の<string> </ string>コンテナーに入れました。ありがとうございました。私はあなたにそれが簡単だと言った!
ウッドジー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.