Làm thế nào để có được các kịch bản shell để chạy khi khởi động trên Yosemite


20

Có một thư mục trong Hệ thống / Thư viện cho các mục khởi động Tôi đoán: StartupItems

Tôi cần phải có một kịch bản shell sẽ cấu hình giao diện ethernet khi khởi động, với địa chỉ mạng cục bộ và mặt nạ mạng con. Tôi cần phải làm điều này bởi vì các tùy chọn mạng để định cấu hình giao diện ethernet sẽ KHÔNG thiết lập nó bằng cài đặt thủ công. Đây có vẻ là một lỗi nghiêm trọng hoặc cài đặt của tôi rất tệ.

Tôi đã được cho lời khuyên sử dụng Networksetup từ dòng lệnh nhưng điều đó sẽ không cấu hình giao diện ethernet theo cách mà các cấu hình sẽ ở đó khi khởi động lại.

Kịch bản cần thực hiện công việc của nó với quyền root hoặc với sudo, nhưng tôi giả sử rằng nếu nó sử dụng sudo, sẽ có một hộp thoại mật khẩu được trình bày khi khởi động khi quá trình khởi động đến tập lệnh đó.

(Tôi đã có đủ kinh nghiệm với FreeBsd và Linux để tìm đường trong thiết bị đầu cuối, nhưng không nhất thiết phải áp dụng cho Mac OSX)

Câu trả lời:


17

Một cách để làm điều đó là gán cho tập lệnh một dịch vụ launchd:

Tạo kịch bản shell như bình thường. Sau đó, bạn có thể tạo một dịch vụ launchd để chạy nó khi khởi động. Những người được đặt tại /Library/LaunchDaemons. Đây là trong định dạng danh sách thuộc tính XML. Tạo cái khác và điền nó với cái gì đó như thế này:

<?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>com.example.app</string>
        <key>ProgramArguments</key>
        <array>
            <string>/bin/sh</string>
            <string>/path/to/script</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>KeepAlive</key>
        <false/>
    </dict>
</plist>

Thay đổi com.example.app, /bin/sh/path/to/scripttheo yêu cầu.

Kịch bản sau đó sẽ chạy trong khi hệ thống đang khởi động. Nếu nó chạy quá sớm, bạn có thể viết tập lệnh để thử và làm những gì cần làm cho đến khi thành công hoặc thoát nó bằng mã lỗi khác không và thêm đoạn mã này vào danh sách thuộc tính trước </dict>dòng:

<key>KeepAlive</key>
<dict>
     <key>SuccessfulExit</key>
     <false/>
</dict>

Để biết thêm về trình khởi chạy và dịch vụ của OS X, tôi khuyên bạn nên tìm ở đây để có một tài liệu tham khảo nhanh về việc tạo chúng hoặc ở đây để tham khảo toàn diện hơn về những gì launchd có thể làm.


Bạn gọi tài liệu này là gì? Và / path / to / script == / System / Library / StartupItems / script?
JeffK

1
Đối với câu hỏi đầu tiên: Tên của tài liệu plist thường sử dụng khóa Nhãn trong danh sách thuộc tính được đặt thành (trong trường hợp này là "com.example.app") với phần mở rộng .plist.
andonuts

1
Đối với câu hỏi thứ hai: Điều đó là chính xác, nhưng kịch bản nên được chuyển đi nơi khác.
andonuts

Plist của bạn là không đúng. Bạn cần một Khóa: <key>Program</key>với giá trị <string>/bin/sh</string>và sau đó <key>ProgramArguments</key>chỉ cần có giá trị<string>/path/to/script</string>
Jon Brooks

Trên thực tế, tôi cũng sai: <key>ProgramArguments</key>cần phải là một mảng ..
Jon Brooks

16

Thời gian trước tôi đã sử dụng cron để làm việc đó. Bạn có thể tạo một mục như thế này

@reboot /path/to/my/script

Thêm thông tin ở đây

Thay vì năm trường đầu tiên, một trong tám chuỗi đặc biệt có thể xuất hiện:

       string          meaning
       ------          -------@reboot ------@reboot
       @reboot         Run once, at startup.
       @yearly         Run once a year, "0 0 1 1 *".
       @annually       (same as @yearly)
       @monthly        Run once a month, "0 0 1 * *".
       @weekly         Run once a week, "0 0 * * 0".
       @daily          Run once a day, "0 0 * * *".
       @midnight       (same as @daily)
       @hourly         Run once an hour, "0 * * * *".

1
Rất tiện để biết!
geotheory

7
cronkhông phải là cách đúng đắn để làm điều này trên OS X những ngày này. Sử dụng LaunchAgent hoặc LaunchDeamon thay thế (launchd). Để biết thêm: developer.apple.com/library/mac/documentation/MacOSX/Conceptual/... Although it is still supported, cron is not a recommended solution. It has been deprecated in favor of launchd.
CousinCocaine

4
cronlà rất dễ dàng để cấu hình hơn launchd, mặc dù. Chỉ cần so sánh hai câu trả lời trong chủ đề này để xem ý tôi là gì. cronlấy một dòng trong một tệp duy nhất, trong đó launchdcần một tập lệnh để mô tả tập lệnh bạn muốn chạy khi khởi động.
Dannid

@Dannid Kron không nhạy cảm khi chạy sao chép, đệm hàng đợi và các thứ khác. Mặc dù khả thi trong trường hợp này, nó không phải luôn luôn là một bộ xương, cũng không phải là một giải pháp thành ngữ.
New Alexandria

Crontab là cách tốt hơn. Nó nhanh chóng và bẩn thỉu và được thành lập từ lâu trong thế giới Unix. Tôi hoàn toàn đào từ khóa @reboot này.
macetway 15/03/2017

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.