Bắt launchd để đọc chính xác các đối số chương trình


18

Tôi có một tập lệnh launchd trong đó lệnh tôi đang cố chạy bị lỗi (rõ ràng đó không phải là một từ, bây giờ), phàn nàn về việc sử dụng không đúng.

Lỗi cụ thể tôi nhận được là văn bản sử dụng của lệnh bị đổ vào nhật ký hệ thống. Từ đây, tôi suy ra thông tin khác (đường dẫn đến lệnh, thời gian, v.v.) trong phần chính đang được phân tích cú pháp chính xác, không phải là tùy chọn của lệnh.

Sau khi sử dụng lệnh, tôi có một dòng cuối cùng:

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

Nhưng điều đó chỉ có nghĩa là "Tôi đã thoát với một lỗi".

Tôi biết launchd tách lệnh từ các tùy chọn của nó và trong trang man cho bạn biết về ProgramArgument: "... Xin lưu ý: nhiều người bị nhầm lẫn bởi khóa này. Vui lòng đọc execvp (3) rất cẩn thận! .."

Vâng, tôi đã đọc execvp (3) và tôi không phải là người khôn ngoan hơn, vì vậy tôi đang hỏi bạn rất nhiều điều đáng yêu.

Thông thường, chạy lệnh từ thiết bị đầu cuối, nó sẽ trông như thế này:

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

Điều này làm việc một điều trị.

Và đây là cách tôi chia nó trong phần Chương trình / Chương trình của chương trình LaunchAgent của tôi:

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

(đối với bản ghi, ban đầu tôi có đường dẫn đến boinccmd \ thoát ra ngoài, nhưng điều đó không hiệu quả, launchd thoát khỏi không gian trong đường dẫn cho bạn)

Tôi đã thử tách các đối số xuống hơn nữa:

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

Nhưng điều đó dường như cũng không hoạt động.

Như mọi khi, tôi rất chắc chắn rằng tôi đang thiếu một cái gì đó quá đơn giản.

Cảm ơn.


CÂU TRẢ LỜI:

Dòng đầu tiên của ProgramArgument cần phải là đường dẫn đến chương trình. Đây là những gì đã làm tôi vấp ngã và thực sự những gì có lẽ có nghĩa là "... Xin hãy đọc thật kỹ! .." :) Tôi cũng thấy rằng tôi phải chia các đối số thành các phần thành phần của chúng. Khi tôi có tất cả những thứ đó, toàn bộ công việc trở nên quyến rũ. Cảm ơn rât nhiều.

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

Một bản chỉnh sửa cuối cùng để nói về một lời giải thích dễ hiểu về lý do TẠI SAO nên xem, giải thích của SirPavlova.

~ W


Sử dụng danh sách launchctl com.label.plist Tôi có thể thấy launchd đang lấy các phần chính xác của lệnh để ghép lại với nhau. Tôi đã nghĩ có lẽ đó là một vấn đề liên quan đến - nhưng dường như không phải vậy.
Woodgie

1
Tôi không có câu trả lời cho vấn đề của bạn, nhưng ví dụ đầu tiên của bạn <string>--host localhost</string>chắc chắn sẽ không hoạt động. Hãy nhớ rằng, khi bạn viết một dòng lệnh vào shell, nó không biết phần nào của tùy chọn và đối số thông thường là gì - nó chỉ phân tách trên khoảng trắng trước khi truyền đối số cho chương trình đang chạy. Ngoài ra, nó có thể hữu ích nếu bạn hiển thị lỗi chính xác boinccmdđang báo cáo.
Kevin Reid

Chỉnh sửa bài viết của tôi để nói những gì tôi đang thấy. Không phải là nó sẽ giúp được gì! Ngoài ra, tôi cũng gặp lỗi tương tự nếu tôi chia các tùy chọn trên khoảng trắng của chúng. Tôi đoán đó là - điều đó gây ra vấn đề bằng cách nào đó.
Woodgie

1
Tôi sẽ thử chỉ sử dụng Chương trình hoặc Chương trình hoặc không phải cả hai
user151019

Câu trả lời:


19

Các Programquy định cụ thể chính các tập tin thực thi, và sự ProgramArgumentschính quy định cụ thể các đối số mà sẽ được chuyển đến quá trình thực hiện. Nói một cách chính xác, bạn có thể chuyển bất kỳ đối số nào bạn muốn cho một quy trình, nhưng quy ước là cái đầu tiên phải là tên mà quá trình được gọi, vì vậy hầu hết các chương trình đều bỏ qua đối số đầu tiên của chúng. Các tập tin để thực hiện rõ ràng là thông tin cần thiết, nhưng nếu Programkhóa được là mất tích, launchd giả vờ nó có giá trị như nhau như là đối số đầu tiên trong ProgramArguments đơn thuần như là một tiện nghi .

Ví dụ đầu tiên của bạn bắt đầu boinccmd và cung cấp cho nó các đối số tương đương với lệnh đầu cuối

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

thông báo cho boinccmd rằng bạn đã gọi nó là "--host localhost" và chỉ truyền cho nó hai đối số lạ.

Ví dụ thứ hai của bạn phân tách các đối số một cách chính xác, nhưng như Eddie Kelley đề xuất, nó cần một đối số được chèn ở phía trước. Nó nói với boinccmd rằng bạn đã gọi nó là "--host", sau đó chuyển qua sáu đối số khác. boinccmd có thể nhận ra năm lựa chọn cuối cùng là hai tùy chọn, nhưng không biết doanh nghiệp "localhost" là gì. Theo như boinccmd có thể nói, nó đã được gọi từ thiết bị đầu cuối như

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

(lưu ý thiếu "--host").

boinccmd có lẽ là một trong những phần lớn các chương trình không quan tâm đến đối số đầu tiên của chúng là gì, vì vậy bạn có thể thực sự chỉ cần ấn <string>HELLO</string>vào phần đầu của ProgramArgumentsmảng, nhưng có lẽ sẽ sạch hơn để loại bỏ Programkhóa hoàn toàn & chỉ sử dụng điều này:

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

Nó có thể có vẻ như một sự thừa vô nghĩa, nhưng một số chương trình sử dụng để hiệu quả tốt: bash et al. đóng vai trò là shell đăng nhập nếu đối số đầu tiên của chúng bắt đầu bằng -, & Vim vào các chế độ mô phỏng khác nhau nếu đối số đầu tiên của nó là edhoặc vithay vì vim.


1
Bạn đăng khi tôi đang chỉnh sửa bài chính của mình! Đây là một lời giải thích tuyệt vời. Cảm ơn bạn.
Woodgie

1
Rất vui khi được giúp đỡ :)
SirPavlova

@SirPavlova, giúp đỡ rất nhiều! Tuy nhiên, có công cụ nào giúp người chuyển đổi lời gọi console sang định dạng plist không?
gaussblurinc

6

Dựa trên trang man cho exec (3), có vẻ như đối số chương trình đầu tiên phải là đường dẫn đến tệp thực thi:

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.

Nếu bạn có thể chỉ định đường dẫn đến tệp thực thi làm đối số tại chỉ mục 0, nó có thể giúp ...


Khi tôi chỉnh sửa bài đăng để hiển thị, boinccmd đang được tìm thấy và chạy, các tùy chọn được chuyển đến nó bằng cách nào đó đang bị sai lệch. Trừ khi tôi thiếu những gì bạn đang nói.
Woodgie 18/11/13

1
@Woodgie Có, điều đó đã được tìm thấy trong Chương trình - Chương trình của bạn không chính xác, nó cần tên đường dẫn của tệp thực thi
user151019

Oh. OH! Tôi nghĩ rằng tôi thấy bây giờ. Cố lên, tôi kiểm tra xem.
Woodgie

BINGO, thực hiện điều đó và đặt từng phần của mỗi lệnh vào vùng chứa <string> </ string> của chính nó hoạt động. Cảm ơn bạn. Tôi đã nói với bạn rằng nó thật đơn giản!
Woodgie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.