เรียกใช้คำสั่งเมื่อเริ่มต้น / เข้าสู่ระบบ (Mac OS X)


53

ฉันสงสัยว่าไฟล์ใดที่ฉันควรวางคำสั่ง bash นี้เพื่อที่จะสามารถทำงานได้เมื่อเริ่มต้น

# Start the MongoDB server
/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log

ฉันได้รับการกำจัดสิ่งสกปรกบนสุทธิและคิดว่ามันเป็นระหว่าง~/.bashrc, ~/profile, /etc/bashrc, หรือ/etc/profile ~/.bash_profileถึงแม้ว่าผมจะมีความพยายามเหล่านี้และพวกเขาดูเหมือนจะทำงานในการเริ่มต้นขั้ว ไม่ได้ เริ่มต้น Mac ฉันไม่มีไฟล์หรือไม่

คำตอบ:


33

ไม่มีสิ่งเหล่านี้อย่างเป็นทางการ แอปเปิ้ลแนะนำวิธีคือการใช้launchd Guis เพื่อตั้งค่านี้รวมถึงlingonและLaunch Control

สำหรับไฟล์ที่คุณพูดถึงไฟล์ในโฮมไดเร็กตอรี่ ~ / .bashrc, ~ / profile, ~ / .bash_profile จะเริ่มเมื่อคุณล็อกอินผ่านเทอร์มินัลเท่านั้น คนที่อยู่ใน / etc จะถูกเรียกใช้โดยเชลล์ที่เริ่มต้นสำหรับผู้ใช้ทั้งหมดก่อนที่จะอยู่ในโฮมไดเร็กตอรี่ แต่เมื่อลงชื่อเข้าใช้ของผู้ใช้แล้ว .. bash manual

สคริปต์เริ่มต้น Unix เกี่ยวข้องกับ / etc / rc * แต่สำหรับ OSX ให้ใช้สิ่งที่เรียกใช้


1
ดังนั้นหากคำสั่งของฉันถูกแทรกลงในไฟล์ใดไฟล์หนึ่งใน/etcนั้นควรรันบน bootup หรือไม่ มันมีความสำคัญกับสิ่งที่อยู่หรือไม่
Wolfy87

1
/etc/bashrcและอื่น ๆ จะถูกเรียกใช้เมื่อคุณเริ่มเชลล์เช่นเดียวกับ~/.bashrc- มันเป็นเพียงแค่ที่อดีตจะทำงานเมื่อใดก็ตามที่ผู้ใช้ใด ๆเริ่มเชลล์มากกว่าแค่ผู้ใช้ของคุณ
สกอตต์

@Scott ถูกต้องฉันได้แก้ไขคำตอบแล้ว
user151019

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

1
@Mark ลิงก์ไปที่ "launchd" ใช้งานไม่ได้ :(
Artem

58

การเรียกใช้คำสั่งที่เริ่มต้นขึ้นใน OS X launchdที่คุณจำเป็นต้องใช้

หากคุณไม่ต้องการใช้Lingonคุณต้องสร้างlaunchdรายการคุณสมบัติ นี่คือไฟล์ XML ดังนั้นคุณสามารถทำกับโปรแกรมแก้ไขข้อความที่คุณชื่นชอบหรือคุณสามารถใช้ตัวแก้ไขรายการคุณสมบัติที่ติดตั้งด้วยเครื่องมือ Mac OS X Dev สร้างสิ่งต่อไปนี้:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>some.meaningful.name</string> <!-- org.mongodb.mongodb perhaps? -->

    <key>OnDemand</key>
    <false/>

    <key>UserName</key>
    <string>anAppropriateUser</string>

    <key>GroupName</key>
    <string>anAppropriateGroup</string>

    <key>ProgramArguments</key>
    <array>
            <string>/Applications/MongoDB/bin/mongod</string>
            <string>--dbpath</string>
            <string>/usr/local/mongo/data</string>
            <string>--fork</string>
            <string>--logpath</string>
            <string>/usr/local/mongo/log</string>
    </array>
</dict>
</plist>

บันทึกใน/Library/LaunchAgents/some.meaningful.name.plist(คุณจะต้องมีบัญชีผู้ดูแลระบบและ / หรือsudo) จากนั้นเปิดเทอร์มินัลและทำ:

sudo launchctl load /Library/LaunchAgents/some.meaningful.name.plist

สิ่งนี้จะทำให้ launchd โหลดไอเท็มซึ่งจะทำให้ MongoDB เริ่มบู๊ต โบนัสlaunchdจะตรวจสอบและถ้ามันออกด้วยเหตุผลใดก็ตามมันจะถูกเริ่มใหม่ ในการกำจัดรายการเพียงแค่แทนที่การโหลดในคำสั่งด้านบนด้วยการยกเลิกการโหลด


1
หน้านี้ ( developer.apple.com/library/mac/documentation/Darwin/Reference/ ...... ) แสดงรายการสิ่งต่างๆที่เปิดตัวโดย launchd ไม่ควรทำ หากฉันต้องการเรียกใช้คำสั่งโดยพลการเมื่อเริ่มต้นฉันอาจไม่สามารถควบคุมได้และคำสั่งอาจยุติการทำสิ่งเหล่านั้น นอกจากนี้ฉันไม่อาจต้องการให้ launchd รีสตาร์ทและรายการที่หยุดเพราะมันเป็นครั้งเดียวหรือจัดการเปิดตัวอีกครั้งด้วยตัวเอง ฉันควรทำอย่างไรในกรณีเหล่านี้
Michael

@Scott ขอบคุณ นี่เป็นคำตอบที่เป็นประโยชน์ที่สุดที่ฉันพบบนอินเทอร์เน็ต
Dmitriy

5
วิธีนี้จะพยายามเรียกใช้แอปพลิเคชันทุก ๆ 10 วินาทีซึ่งทำงานได้ดีสำหรับบริการที่ไม่ตาย หากนี่เป็นสคริปต์ที่ทำงานหนึ่งครั้งตรงต่อเวลา (ในกรณีของฉันการส่งข้อความเมื่อ Slack เมื่อรีบูต) เพิ่ม<key>LaunchOnlyOnce</key><true/>ไปยัง dict
msanford

จุดที่ดี Mr Sanford launchd ที่ไม่ยอมแพ้สร้างไฟล์บันทึกขนาดใหญ่ซึ่งทำให้ Mac ของคุณช้าลง (เนื่องจากการอ่านและเขียนไฟล์บันทึกขนาดใหญ่ดังกล่าวอย่างต่อเนื่อง) ฉันอาจใช้การแก้ไขนั้นกับซอฟต์แวร์เชิงพาณิชย์ที่เขียนไม่ดีบางตัวที่ทำงานบนคอมพิวเตอร์ของฉันในตอนนี้
Foliovision

1
หมายเหตุถึงตนเอง: หากคุณต้องการตัวแปรสภาพแวดล้อม: serverfault.com/questions/111391/…
Quandary

48

อีกวิธีง่ายๆจาก Stack Overflow : คุณสามารถ:

  • เริ่ม Automator.app
  • เลือก "แอปพลิเคชัน";
  • คลิก "แสดงไลบรารี" ในแถบเครื่องมือ (หากซ่อน)
  • เพิ่ม "Run shell script" (จาก Actions / Utilities);
  • คัดลอกและวางสคริปต์ของคุณลงในหน้าต่าง
  • ทดสอบมัน;
  • บันทึกไว้ที่อื่น: ไฟล์ที่ถูกเรียกyour_name.appจะถูกสร้างขึ้น)
  • ขึ้นอยู่กับรุ่น MacOSX ของคุณ:
    • เวอร์ชันเก่า : ไปที่การตั้งค่าระบบ→บัญชี→รายการเข้าสู่ระบบหรือ
    • เวอร์ชันใหม่ : ไปที่การตั้งค่าระบบ→ผู้ใช้และกลุ่ม→รายการเข้าสู่ระบบ (ด้านบนขวา);
  • เพิ่มแอพที่สร้างขึ้นใหม่นี้

ออกจากระบบเข้าสู่ระบบอีกครั้งและคุณควรจะทำ ;)


2
ผ่านการทดสอบและใช้งานได้และไม่จำเป็นต้องมีการแก้ไข plist plist ที่ยุ่งยากหรือแอพ Lingon ที่ต้องเสียเงิน
Lukasz

4
อย่างไรก็ตามมันเพิ่ม 1804k ของ boilerplate ให้กับ shellscript สามบรรทัดของคุณ!
android.weasel

1
ขอบคุณสำหรับคำแนะนำโดยละเอียดเกี่ยวกับการทำสิ่งที่มีประโยชน์กับ Automator สิ่งนี้จะช่วยฉันไม่เพียงแค่กับงานเดียว ขอบคุณ Jaime ฉันใช้มันเพื่อปิด Turbo Boost ผ่าน Turbo Boost Switcher ฉันเป็นเจ้าของรุ่นจ่าย แต่กลไกการออกใบอนุญาตน่ากลัวพอฉันชอบใช้รุ่นฟรีที่ต้องเปิดผ่านเทอร์มินัลเพื่อหลีกเลี่ยงการขอรหัสผ่านของผู้ดูแลระบบทุกครั้งที่ตื่นจากโหมดสลีป
Foliovision

1
@ android.weasel ดูคำตอบของ Geekarist superuser.com/a/995564/255375
JD

Superuse-ful :-D, +1
Mukul Goel

28

ในการเปิดใช้คำสั่งเมื่อลงชื่อเข้าใช้คุณสามารถทำสิ่งนี้:

  • สร้างไฟล์ข้อความที่มีคำสั่งของคุณ (สคริปต์ทุบตี):

    #!/bin/bash
    
    # Start the MongoDB server
    /Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
    
  • บันทึกไฟล์นี้ใน ~/Library/Startup.cmd

  • คุณสามารถทดสอบได้โดยดับเบิลคลิกที่ไฟล์ใน Finder
  • ทำให้ปฏิบัติการได้: chmod +x ~/Library/Startup.cmd
  • เพิ่มไฟล์นี้ในการตั้งค่าระบบ> บัญชี> รายการเข้าสู่ระบบ

3
คำตอบที่ดีที่สุดและง่ายที่สุด ง่ายกว่าโซลูชันที่ยอมรับ โปรดทราบว่ามันอยู่ในการตั้งค่าระบบ> ผู้ใช้ & กลุ่ม> รายการเข้าสู่ระบบ ... (ไม่ใช่บัญชี) ... และโปรดทราบว่าไฟล์สามารถอยู่ที่ใดก็ได้โดยไม่ต้องลงท้ายด้วย. cmd แค่ chmod + x มัน
foreyez

5
อย่างไรก็ตามรายการล็อกอินทำงานที่การเข้าสู่ระบบไม่ใช่เมื่อเริ่มต้นระบบ หากคุณเรียกใช้เซิร์ฟเวอร์นั่นเป็นข้อแตกต่างใหญ่
not2savvy

คุณพูดถูก @ not2savvy สำหรับเซิร์ฟเวอร์ฉันจะแนะนำ @ คำตอบ Sridhar-Sarnobat @rebootกับ อย่างไรก็ตามคำตอบของฉันจะอนุญาตให้เริ่มโปรแกรมกราฟิกนั่นคือสาเหตุที่ฉันคิดว่ามันมีประโยชน์
Geekarist

ทำไมจบลงด้วยการcmdแทนsh?
Simin Jie

3

คุณจะต้องดูว่าlaunchdและlaunchctlทำงานกับ MacOS ได้อย่างไร คุณสามารถเริ่มต้นด้วยการอ่าน man pages สำหรับทั้งคำสั่ง จากนั้นคุณสามารถดูภายใน/Library/LaunchAgents/และ/Library/LaunchDaemons/ตัวอย่างวิธีการตั้งค่าแอปพลิเคชันให้โหลดในเวลาที่ต่างกันผ่านlaunchctlอินเทอร์เฟซ

นี่คือตัวอย่างที่ฉันพบใน Stack Overflow ที่อาจช่วยคุณเพิ่มเติม



0

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

มาตรฐานสำหรับเชลล์ล็อกอินคือการค้นหาไฟล์การกำหนดค่า bash ที่มี "profile" ในชื่อตามลำดับนี้: / etc / profile, ~ / .bash_profile, จากนั้น ~ / .bash_login และสุดท้าย ~ / .profile เมื่อล็อกอินเชลล์ออกแล้วพวกเขาอ่าน ~ / .bash_logout

ในกรณีของฉันฉันเพิ่งสร้าง ~ / .bash_profile จากนั้นฉันเปิดการตั้งค่าสำหรับแอพ Terminal Mac และเปลี่ยนตัวเลือก "Shell opens with" จากค่าเริ่มต้นเป็น / bin / bash แค่นั้นแหละ. สะอาดและเรียบง่าย


-3

เปิดเทอร์มินัลพิมพ์

nano ~/.bash_profile

จากนั้นเพิ่มข้อความนี้ในไฟล์:

/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork logpath /usr/local/mongo/log

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