วิธีรับเชลล์สคริปต์เพื่อให้ทำงานเมื่อเริ่มต้นบน Yosemite


21

มีไดเรกทอรีในระบบ / ไลบรารีสำหรับรายการเริ่มต้นที่ฉันเข้าใจว่า: StartupItems

ฉันต้องมีเชลล์สคริปต์ที่จะกำหนดค่าอินเทอร์เฟซอีเธอร์เน็ตเมื่อเริ่มต้นด้วยที่อยู่เครือข่ายท้องถิ่นและซับเน็ตมาสก์ ฉันต้องทำเช่นนี้เพราะการตั้งค่าเครือข่ายสำหรับการกำหนดค่าส่วนต่อประสานอีเธอร์เน็ตจะไม่ตั้งค่าโดยใช้การตั้งค่าด้วยตนเอง นี่ดูเหมือนจะเป็นข้อผิดพลาดร้ายแรงหรือการติดตั้งของฉันไม่ดี

ฉันได้รับคำแนะนำให้ใช้ networksetup จากบรรทัดคำสั่ง แต่จะไม่กำหนดค่าอินเตอร์เฟสอีเธอร์เน็ตในลักษณะที่จะมีการกำหนดค่าเมื่อรีบูต

สคริปต์จำเป็นต้องทำงานกับสิทธิพิเศษรูทหรือด้วย sudo แต่ฉันสมมติว่าถ้าใช้ sudo จะมีกล่องโต้ตอบรหัสผ่านปรากฏขึ้นในเวลาบูตเมื่อกระบวนการบู๊ตมาถึงสคริปต์นั้น

(ฉันมีประสบการณ์กับ FreeBsd และ Linux มากพอที่จะหาทางของฉันในเทอร์มินัล แต่ไม่จำเป็นต้องใช้กับ Mac OSX)

คำตอบ:


18

วิธีหนึ่งในการทำเช่นนั้นคือการกำหนดสคริปต์ให้กับบริการ launchd:

สร้างเชลล์สคริปต์ตามปกติ จากนั้นคุณสามารถสร้างบริการ launchd เพื่อเรียกใช้เมื่อเริ่มต้น /Library/LaunchDaemonsเหล่านี้จะตั้งอยู่ที่ เหล่านี้อยู่ในรูปแบบรายการคุณสมบัติ XML สร้างใหม่และเติมด้วยสิ่งนี้:

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

เปลี่ยนcom.example.app, /bin/shและ/path/to/scriptตามความจำเป็น

สคริปต์จะทำงานในขณะที่ระบบกำลังบูท หากทำงานเร็วเกินไปคุณสามารถเขียนสคริปต์เพื่อลองและทำสิ่งที่ต้องทำจนกว่าจะสำเร็จหรือให้ออกด้วยรหัสข้อผิดพลาดที่ไม่เป็นศูนย์และเพิ่มลงในรายการคุณสมบัติก่อน</dict>บรรทัด:

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเปิดตัว OS X daemons และบริการฉันขอแนะนำให้ดูที่นี่สำหรับการอ้างอิงอย่างรวดเร็วเกี่ยวกับการสร้างพวกเขาหรือที่นี่สำหรับการอ้างอิงที่ครอบคลุมมากขึ้นเกี่ยวกับสิ่งที่ launchd สามารถทำได้


คุณเรียกเอกสาร plist นี้ว่าอะไร? และ / path / to / script == / System / Library / StartupItems / script หรือไม่
JeffK

1
สำหรับคำถามแรก: โดยทั่วไปชื่อของเอกสาร plist จะใช้สิ่งที่คีย์ Label ในรายการคุณสมบัติถูกตั้งค่าเป็น (ในกรณีนี้คือ "com.example.app") พร้อมด้วยนามสกุล. plist
andonuts

1
สำหรับคำถามที่สอง: ถูกต้อง แต่สคริปต์ควรถูกย้ายไปที่อื่น
andonuts

ข้อผิดพลาดของคุณผิดรูปแบบ คุณต้องมีคีย์: <key>Program</key>ด้วยค่า<string>/bin/sh</string>และจากนั้น<key>ProgramArguments</key>ควรมีค่า<string>/path/to/script</string>
Jon Brooks

ที่จริงแล้วเหมืองของฉันก็ผิดเช่นกัน: <key>ProgramArguments</key>ต้องเป็นอาเรย์ ..
Jon Brooks

16

ก่อนหน้านี้ฉันใช้ cron ทำอย่างนั้น คุณสามารถสร้างรายการเช่นนี้

@reboot /path/to/my/script

ข้อมูลเพิ่มเติมที่นี่

แทนที่จะเป็นห้าฟิลด์แรกหนึ่งในแปดสตริงพิเศษอาจปรากฏขึ้น:

       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
มีประโยชน์มากที่จะรู้!
geotheory

7
cronไม่ใช่วิธีที่ถูกต้องในการทำเช่นนี้ใน OS X ทุกวันนี้ ใช้ LaunchAgent หรือ LaunchDeamon แทน (launchd) สำหรับข้อมูลเพิ่มเติม: 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.
......

4
cronlaunchdแม้ว่าจะกำหนดค่าได้ง่ายกว่ามาก เพียงเปรียบเทียบคำตอบทั้งสองในกระทู้นี้เพื่อดูว่าฉันหมายถึงอะไร cronรับหนึ่งบรรทัดในไฟล์เดียวโดยที่launchdสคริปต์ต้องการอธิบายสคริปต์ที่คุณต้องการให้รันตอนบูต
Dannid

@Dannid Kron ไม่ไวต่อการเรียกใช้การทำซ้ำการบัฟเฟอร์คิวและอื่น ๆ แม้ว่าจะเป็นไปได้ในกรณีนี้มันไม่ได้เป็นคีย์โครงกระดูกเสมอไปและไม่ได้เป็นวิธีแก้ปัญหาเชิงสำนวน
ใหม่ Alexandria

Crontab ดีกว่า มันรวดเร็วและสกปรกและก่อตั้งมายาวนานในโลก Unix ฉันขุดคำหลัก @reboot นี้โดยสิ้นเชิง
macetw

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.