Saya memiliki skrip launchd di mana perintah yang saya coba jalankan salah (ternyata itu bukan kata, sekarang), mengeluhkan penggunaan yang tidak benar.
Kesalahan spesifik yang saya dapatkan adalah teks penggunaan perintah dibuang ke log sistem. Dari sini saya menyimpulkan info lain (path ke perintah, waktu dll) dalam daftar sedang diurai dengan benar, hanya saja bukan opsi perintah.
Setelah penggunaan perintah saya memiliki satu baris terakhir:
18/11/2013 09:30:00.101 com.apple.launchd.peruser.501: (fake.lable.seti[33833]) Exited with code: 1
Tapi itu hanya berarti "Saya keluar dengan kesalahan".
Saya tahu launchd memisahkan perintah dari opsinya dan di halaman manual memberi tahu Anda tentang ProgramArguments: "... Harap dicatat: banyak orang bingung dengan kunci ini. Harap baca execvp (3) dengan sangat hati-hati! .."
Yah saya membaca execvp (3) dan saya bukan orang yang lebih bijak, jadi saya banyak bertanya kepada Anda.
Biasanya, menjalankan perintah dari terminal akan terlihat seperti ini:
/Library/Application\ Support/BOINC\ Data/boinccmd --host localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update
Ini berhasil.
Dan ini adalah bagaimana saya membaginya di bagian Program / ProgramArguments dari daftar LaunchAgent saya:
<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>
(sebagai catatan, saya awalnya memiliki jalan menuju boinccmd \ lolos, tetapi itu tidak berhasil, launchd lolos dari ruang di jalur untuk Anda)
Saya sudah mencoba memisahkan argumen ke bawah:
<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>
Tapi sepertinya itu juga tidak berhasil.
Seperti biasa, saya sangat yakin saya kehilangan sesuatu yang begitu sederhana.
Terima kasih.
MENJAWAB:
Baris pertama dari ProgramArguments perlu menjadi jalur ke program. Inilah yang membuat saya tersandung dan memang apa yang mungkin dimaksud dengan komentar "... Mohon baca dengan saksama! .." :) Saya juga menemukan saya harus membagi argumen menjadi beberapa bagian komponen. Ketika saya memiliki semua itu di tempat semuanya bekerja pesona. Terima kasih banyak.
<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>
Hasil edit terakhir untuk penjelasan yang mudah dimengerti MENGAPA ini seharusnya, lihat penjelasan SirPavlova.
~ W
<string>--host localhost</string>
pasti tidak akan berfungsi. Ingat, ketika Anda menulis baris perintah ke shell, ia tidak tahu apa yang menjadi bagian dari opsi dan apa argumen reguler - hanya terpecah pada spasi sebelum meneruskan argumen ke program yang sedang dijalankan. Selain itu, mungkin membantu jika Anda menunjukkan kesalahan yangboinccmd
dilaporkan.Jawaban:
The
Program
key menentukan file untuk mengeksekusi, & yangProgramArguments
utama menentukan argumen yang akan diteruskan ke proses mengeksekusi. Sebenarnya Anda dapat melewati argumen apa pun yang Anda inginkan untuk suatu proses, tetapi konvensi adalah bahwa yang pertama haruslah nama yang dengannya proses itu dijalankan, sehingga sebagian besar program mengabaikan argumen pertama mereka. ‡ File yang akan dieksekusi jelas merupakan informasi yang diperlukan, tetapi jikaProgram
kuncinya hilang, launchd berpura-pura memiliki nilai yang sama dengan argumen pertamaProgramArguments
semata-mata sebagai kenyamanan .Contoh pertama Anda mulai boinccmd & memberikan argumen yang setara dengan perintah terminal
yang memberitahu boinccmd bahwa Anda memanggilnya sebagai "--host localhost" & hanya memberikan dua argumen aneh.
Contoh kedua Anda memisahkan argumen dengan benar, tetapi seperti yang disarankan Eddie Kelley, argumen itu perlu dimasukkan di depan. Ia memberi tahu boinccmd bahwa Anda memanggilnya sebagai "--host", lalu memberikan enam argumen lagi. boinccmd dapat mengenali lima terakhir sebagai dua opsi, tetapi tidak tahu apa arti bisnis "localhost". Sejauh yang diketahui boinccmd, itu dipanggil dari terminal sebagai
(perhatikan "--host" yang hilang).
boinccmd mungkin salah satu dari sebagian besar program yang tidak peduli apa argumen pertama mereka, jadi Anda mungkin bisa benar-benar hanya mendorong
<string>HELLO</string>
di bagian atasProgramArguments
array, tetapi mungkin lebih bersih untuk menghapusProgram
kunci sama sekali & cukup gunakan ini:‡ Ini bisa terlihat seperti redundansi yang tidak berarti, tetapi beberapa program menggunakan ini untuk efek yang baik: bash et al. bertindak sebagai shell login jika argumen pertama mereka dimulai dengan
-
, & Vim memasuki berbagai mode emulasi jika argumen pertamanya adalahed
atauvi
bukanvim
.sumber
Berdasarkan halaman manual untuk exec (3), tampaknya argumen program pertama harus menjadi jalur ke executable:
Jika Anda dapat menentukan path ke executable sebagai argumen di indeks 0, itu mungkin membantu ...
sumber