Program argümanlarını doğru okumak için fırlatma


18

Çalışmaya çalıştığım komutun hata olduğu bir launchd betiğim var (görünüşe göre bu bir kelime değil, şimdi), yanlış kullanımdan şikayet ediyor.

Aldığım belirli bir hata, komutun kullanım günlüğüne sistem günlüğüne dökülmesidir. Bundan plist içindeki diğer bilgileri (komuta giden yol, zamanlama vb.) Doğru şekilde ayrıştırıyorum, sadece komutun seçeneklerini değil.

Komut kullanımından sonra son bir satırım var:

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

Ama bu sadece "bir hata ile çıktım" anlamına geliyor.

Launchd komutunu seçeneklerinden ayırır ve man sayfasında ProgramArguments hakkında bilgi verir: "... Lütfen dikkat: birçok kişi bu anahtarla karıştırılır. Lütfen execvp (3) 'ü çok dikkatli okuyun! .."

Ben execvp (3) okudum ve ben daha akıllı değilim, bu yüzden size çok soruyorum.

Normalde, komutu terminalden çalıştırmak şu şekilde görünecektir:

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

Bu bir tedavi olur.

LaunchAgent plistimin Program / ProgramArguments bölümüne şu şekilde ayırdım:

<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>

(kayıt için, başlangıçta boinccmd \ 'den kaçtım, ama bu işe yaramadı, launchd sizin için yoldaki boşluklardan kaçıyor)

Argümanları daha fazla ayırmayı denedim:

<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>

Ama bu da işe yaramadı.

Her zamanki gibi, bu kadar basit bir şeyi kaçırdığımdan eminim.

Teşekkürler.


CEVAP:

ProgramArguments öğesinin ilk satırı, programın yolu olmalıdır. Beni harekete geçiren şey buydu ve gerçekten de "... Lütfen dikkatlice okuyun! .." yorumuyla kastedilen buydu. Ben bütün bu yerde vardı her şey bir cazibesi çalışır. Çok teşekkür ederim.

<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>

Bunun neden olması gerektiğine dair anlaşılması kolay bir açıklama için son bir düzenleme, SirPavlova'nın açıklamasına bakın.

~ W


Launchctl list com.label.plist kullanarak launchd komutunun doğru parçaların bir araya getirildiğini görebiliyorum. Belki de bununla ilgili bir sorun olduğunu düşünüyordum, ama görünüşe göre değil.
Woodgie

1
Ben senin soruna bir cevabım yok, ama ile ilk örneği <string>--host localhost</string>kesinlikle olacak değil çalışır. Bir kabuğa bir komut satırı yazdığınızda, bir seçeneğin ne olduğu ve düzenli bir argümanın ne olduğu hakkında hiçbir fikri yoktur - argümanları çalıştırılan programa geçirmeden önce boşluklara ayrılır . Ayrıca, boinccmdbildirilen hatayı tam olarak göstermeniz de yardımcı olabilir .
Kevin Reid

Gördüğümü söylemek için yazımı düzenledim. Bunun herhangi bir yardımcı olacağından değil! Ayrıca, seçenekleri boşluklarına ayırırsam aynı hatayı alıyorum. Tahmin ediyorum - bu bir şekilde soruna neden oluyor.
Woodgie

1
Ben sadece Program veya ProgramArguments her ikisini birden kullanmayı denerdim
user151019

Yanıtlar:


19

ProgramAnahtar belirtir dosya yürütmek, & ProgramArgumentsanahtar yürütme sürecine geçilecek argümanlar belirtir. Açıkça söylemek gerekirse, bir sürece istediğiniz argümanları aktarabilirsiniz, ancak kural, ilkinin işlemin çağrıldığı ad olması gerektiğidir, bu nedenle çoğu program ilk argümanlarını görmezden gelir. Exec Yürütülecek dosya açık bir şekilde gerekli bilgilerdir, ancak Programanahtar eksikse, launchd, ProgramArguments yalnızca bir kolaylık olarak ilk argümanla aynı değere sahip olduğunu iddia eder .

İlk örneğiniz boinccmd'yi başlatır ve ona terminal komutuna eşdeğer olabilecek bağımsız değişkenler verir

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

Bu da boinccmd'ye "--host localhost" olarak çağırdığınızı söyler ve sadece iki garip argüman geçirdi.

İkinci örneğiniz argümanları doğru bir şekilde ayırır, ancak Eddie Kelley'nin öne sürdüğü gibi ön tarafa bir tane eklemesi gerekir. Boinccmd'ye "--host" olarak çağırdığınızı ve ardından altı argüman daha ilettiğinizi söyler. boinccmd son beşi iki seçenek olarak tanıyabilir, ancak "localhost" işinin ne hakkında olduğu hakkında hiçbir fikri yoktur. Boinccmd'in görebildiği kadarıyla terminalden çağrıldı.

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

(eksik "--host" a dikkat edin).

boinccmd muhtemelen ilk argümanlarının ne olduğunu umursamayan programların büyük çoğunluğundan biridir, bu yüzden muhtemelen dizinin <string>HELLO</string>başında kıpırdayabilirsiniz ProgramArguments, ancak Programanahtarı tamamen kaldırmak ve bunu kullanmak muhtemelen daha temizdir :

<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>

Meaning Anlamsız bir artıklık gibi görünebilir, ancak bazı programlar bunu iyi bir etki için kullanır: bash et al. ilk argümanları ile başlarsa giriş kabukları gibi davranır -ve Vim ilk argümanı ise edveya viyerine çeşitli öykünme modlarına girer vim.


1
Ana yazımı düzenlerken yayınladın! Bu harika bir açıklama. Teşekkür ederim.
Woodgie

1
Yardım için sevindim :)
SirPavlova

@SirPavlova, harika yardım! Ancak, kişinin konsol çağrısını plist biçimine dönüştürmesine yardımcı olan herhangi bir araç var mı?
gaussblurinc

6

Exec (3) için man sayfasına dayanarak, ilk program argümanının yürütülebilir dosyaya giden yol olması gerekir:

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.

Yürütülebilir dosyanın yolunu, dizin 0'daki bağımsız değişken olarak belirtebilirseniz, yardımcı olabilir ...


Gösteriyi göstermek için düzenlediğimde, boinccmd bulunmakta ve çalıştırılmaktadır, ona aktarılan seçenekler bir şekilde karıştırılmaktadır. Söylediklerini özlemediğim sürece.
Woodgie

1
@Woodgie Evet Programda bulundu
ProgramArguments yanlıştır

Ah. OH! Sanırım şimdi görüyorum. Bekle, bunu test edeyim.
Woodgie

BINGO, bunu yaparak ve her komutun her bir parçasını kendi <string> </string> kabına koyarak çalıştı. Teşekkür ederim. Basit olduğunu söyledim!
Woodgie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.