ใช้สคริปต์เมื่อเข้าสู่ระบบ mac [ปิด]


280

ฉันสงสัยว่าใครสามารถช่วยฉันออกด้วยการรับไฟล์. sh ให้ทำงานเมื่อฉันลงชื่อเข้าใช้บัญชีของฉันบนคอมพิวเตอร์ของฉัน ฉันใช้ Mac OS X 10.6.7

ฉันมีไฟล์ "Example.sh" ที่ฉันต้องการเรียกใช้เมื่อลงชื่อเข้าใช้คอมพิวเตอร์ของฉัน ฉันไม่มีปัญหาในการใช้งานเมื่อฉันเข้าสู่ระบบแล้ว แต่ฉันต้องการให้มันทำงานโดยอัตโนมัติ

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


3
นี่ไม่ใช่หัวข้อ ... ฉันต้องการให้เริ่ม Emacs daemon ของฉัน;) BTW คำตอบที่ดีที่สุดคือ IMHO แอป Lingon X
HappyFace

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

คำตอบ:


379

ทำตามสิ่งนี้:

  • เริ่มต้น Automator.app
  • เลือก Application
  • คลิกShow libraryในแถบเครื่องมือ (หากซ่อนไว้)
  • เพิ่มRun shell script(จากActions/Utilities)
  • คัดลอกและวางสคริปต์ของคุณในหน้าต่าง
  • ทดสอบมัน
  • บันทึกที่ไหนสักแห่ง (เช่นคุณสามารถสร้างApplicationsโฟลเดอร์ในบ้านของคุณคุณจะได้รับyour_name.app)

  • ไปที่System Preferences-> Accounts->Login items

  • เพิ่มแอพนี้
  • ทดสอบ & เสร็จ;)

แก้ไข:

ฉันเพิ่งได้รับตรา "คำตอบที่ดี" สำหรับคำตอบนี้ ในขณะที่การแก้ปัญหาของฉันเป็นเรื่องง่ายและการทำงานวิธีที่สะอาดเพื่อเรียกใช้โปรแกรมใด ๆ หรือเชลล์สคริปต์ในเวลาที่เข้าสู่ระบบจะอธิบายไว้ใน@ คำตอบของ trisweb , เว้นแต่คุณต้องการการติดต่อสื่อสารเว้นแต่คุณต้องการการติดต่อสื่อสาร

ด้วยโซลูชันอัตโนมัติคุณสามารถทำสิ่งต่อไปนี้: แอปพลิเคชันล็อกอินหน้าจออัตโนมัติ

ดังนั้นขอให้เรียกใช้สคริปต์หรือออกจากแอปขอรหัสผ่านเรียกใช้เวิร์กโฟลว์อัตโนมัติอื่น ๆ ในเวลาเข้าสู่ระบบเรียกใช้โปรแกรมประยุกต์ตามเงื่อนไขในเวลาเข้าสู่ระบบและอื่น ๆ ...


2
@GregMiernicki LOL สวัสดีตอนเช้า ... ;) เกือบหนึ่งปีที่ผ่านมาเพิ่มการแก้ไขในคำตอบของฉันที่บอกสิ่งนี้ด้วย แต่นี่เป็นเรื่องที่ค่อนข้างง่ายสำหรับผู้ใช้ทั่วไปเนื่องจากการสร้างไฟล์ XML (plist) นั้นไม่ได้ใช้งานง่ายสำหรับผู้ใช้หลายคน อย่างไรก็ตาม - thanx สำหรับความคิดเห็น ;)
jm666

4
@GregMiernicki และอย่าลืมด้วยโซลูชันอัตโนมัติคุณสามารถสร้างสคริปต์เข้าสู่ระบบแบบโต้ตอบ - เช่นสคริปต์สิ่งที่จะขอให้คุณป้อนบางรายการ (เช่นรหัสผ่านเพิ่มเติมหรืออะไรทำนองนั้น) โลกไม่ได้เป็นเพียงสีดำหรือสีขาวอย่างน้อยมันก็เหมือนม้าลาย ... :) :)
jm666

2
@Cupidvogel การเรียกใช้ daemon ในเวลาที่เข้าสู่ระบบนั้นเป็นงานสำหรับโซลูชัน launchd - ดูคำตอบของ trisweb หากคุณสามารถจัดการ python daemon ได้คุณแน่ใจว่าจะสามารถจัดการไฟล์กำหนดค่า plist ซึ่งคุณสามารถจัดการทุกแง่มุมของการรีสตาร์ทและอื่น ๆ ...
jm666

3
รุ่งโรจน์ที่ชี้ให้เห็นคำตอบอื่น ๆ ว่าเป็นคนที่สะอาดที่สุด นั่นควรจะได้รับตราความเป็นพลเมืองที่ดี :)
studgeek

2
คำตอบที่น่าอัศจรรย์ อย่าส่งออก PATH = / usr / local / bin: $ PATH ที่จุดเริ่มต้นของสคริปต์ถ้าคุณต้องการเรียกใช้คำสั่งเช่น "ผู้แต่งทั่วโลกผู้แต่ง" ในการเริ่มต้นระบบ
เลโอนาร์โด

377

TL; DR: ปล่อยกระบวนการพื้นเมืองใช้ OSX launchdและผู้จัดการ

ให้ทำlaunchctldaemon คุณจะสามารถควบคุมสคริปต์ได้ทุกด้าน คุณสามารถเรียกใช้ครั้งเดียวหรือยังมีชีวิตอยู่เป็นภูต ในกรณีส่วนใหญ่นี่เป็นวิธีที่จะไป

  1. สร้าง.plistไฟล์ตามคำแนะนำในเอกสาร Apple Dev ที่นี่หรือรายละเอียดเพิ่มเติมด้านล่าง
  2. สถานที่ใน ~/Library/LaunchAgents
  3. เข้าสู่ระบบ (หรือเรียกใช้ด้วยตนเองผ่านlaunchctl load [filename.plist])

สำหรับข้อมูลเพิ่มเติมเกี่ยวlaunchd, บทความวิกิพีเดียเป็นสิ่งที่ดีมากและอธิบายระบบและข้อได้เปรียบกว่าระบบเก่าอื่น ๆ


นี่คือเฉพาะไฟล์ plist เพื่อเรียกใช้สคริปต์ที่เข้าสู่ระบบ

อัปเดต 2017/09/25 สำหรับ OSX El Capitan และใหม่กว่า (ให้เครดิตกับJosé Messias Jr ):

<?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>com.user.loginscript</string>
   <key>ProgramArguments</key>
   <array><string>/path/to/executable/script.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

แทนที่<string>หลังคีย์โปรแกรมด้วยคำสั่งที่คุณต้องการ (โปรดทราบว่าสคริปต์ใด ๆ ที่อ้างอิงโดยคำสั่งนั้นจะต้องสามารถเรียกใช้งานได้chmod a+x /path/to/executable/script.shเพื่อให้แน่ใจว่าเป็นสำหรับผู้ใช้ทุกคน)

บันทึกเป็น ~/Library/LaunchAgents/com.user.loginscript.plist

เรียกใช้launchctl load ~/Library/LaunchAgents/com.user.loginscript.plistและออกจากระบบ / เพื่อทดสอบ (หรือทดสอบโดยตรงเรียกใช้launchctl start com.user.loginscript)

ตัด/var/log/system.logข้อความผิดพลาด

กุญแจสำคัญคือนี่เป็นรายการ launchd เฉพาะผู้ใช้ดังนั้นมันจะถูกเรียกใช้ในการเข้าสู่ระบบสำหรับผู้ใช้ที่กำหนด daemons การเปิดใช้งานระบบเฉพาะ (วางไว้ใน/Library/LaunchDaemons) จะทำงานในการบูต

หากคุณต้องการให้สคริปต์ทำงานในการเข้าสู่ระบบสำหรับผู้ใช้ทั้งหมดฉันเชื่อว่า LoginHook เป็นตัวเลือกเดียวของคุณและนั่นอาจเป็นเหตุผลที่มันมีอยู่


4
ใช่. FWIW ฉันพบบล็อกนี้ในเทคนิคเดียวกันที่เป็นประโยชน์: developernotes.com/archive/2011/04/06/169.aspx
Daniel James

8
คุณละเลยที่จะพูดถึงสิ่งที่น่าสงสัยเกี่ยวกับการกระทำของ Automator และทำไมพวกเขาถึงไม่แนะนำ
Mike Campbell

4
นี่คือภาพรวมที่ดีเกี่ยวกับการกระทำโฟลเดอร์ VS launchctl: apple.stackexchange.com/a/63731/38290 - และอื่นเกี่ยวกับหนึ่งในข้อ จำกัด ของ LoginHook (เพียงหนึ่งสคริปต์ได้รับอนุญาต) - superuser.com/a/377401 ไม่ใช่ว่าเป็นวิธีที่น่าสงสัยหรือน่าสงสาร แต่launchctlก็ดีกว่าในกรณีส่วนใหญ่และช่วยให้คุณสามารถควบคุมการใช้งานสคริปต์ของคุณได้ดีขึ้น เป็นเรื่องของ "ทำไมใช้วิธีที่มีความสามารถน้อยลงเมื่อมี launchd อยู่" (หมายเหตุฉันได้เปลี่ยนประโยคแรกที่จะแสดงให้เห็นว่าผมเองไม่แนะนำเหล่านี้สำหรับสถานการณ์เช่นนี้)
trisweb

3
สงสัยว่าคุณจะสร้าง LaunchDaemon ได้อย่างไรว่าอะไรจะทำงานทุกครั้งเมื่อผู้ใช้ลงชื่อเข้าใช้ . ดังนั้นไม่ใช่เมื่อระบบบู๊ต แต่ทุกครั้งเมื่อผู้ใช้เข้าสู่ระบบ (ลองด้วยรอบการออกจากระบบเข้าสู่ระบบ) คุณช่วยกรุณาแสดงให้เห็นอย่างชัดเจน (ไม่เพียง แต่ bla-bla) วิธีการใช้งานโซลูชันอัตโนมัติด้านบน (โดยคุณผิด) ด้วย launchctl?
cajwine

9
ไฟล์ Plist ใน/ Library / LaunchAgents /ถูกเรียกใช้เมื่อล็อกอินด้วย id ของผู้ใช้ที่ล็อกอิน ไฟล์ Plist ใน/ Library / LaunchDaemons /รันในเวลาบูตเนื่องจากรูท (id สามารถเปลี่ยนได้ด้วยรหัสผู้ใช้ )
bain

42
  1. สร้างเชลล์สคริปต์login.shของคุณในโฟลเดอร์ $ HOME

  2. วางสคริปต์หนึ่งบรรทัดต่อไปนี้ลงใน Script Editor:

    ทำเชลล์สคริปต์ "$ HOME / login.sh"

  3. จากนั้นบันทึกเป็นแอปพลิเคชัน

  4. ในที่สุดเพิ่มแอปพลิเคชันในรายการเข้าสู่ระบบของคุณ

หากคุณต้องการทำให้เอาต์พุตสคริปต์เป็นภาพคุณสามารถสลับขั้นตอนที่ 2 สำหรับสิ่งนี้:

tell application "Terminal"
  activate
  do script "$HOME/login.sh"
end tell

หากจำเป็นต้องใช้คำสั่งหลายคำสั่งแบบนี้:

tell application "Terminal"
  activate
  do script "cd $HOME"
  do script "./login.sh" in window 1
end tell

1
ฉันเชื่อมโยงสิ่งนี้สิ่งเดียวที่ขาดหายไปคือตัวติดตั้งบรรทัดคำสั่ง;)
sorin

1
ทางออกที่ดี ฉันจะซ่อนหน้าต่าง "เข้าสู่ระบบ" ได้อย่างไร? ฉันลองทำเครื่องหมายในรายการเข้าสู่ระบบ
xgdgsc

1
@xgdgsc: ไปที่Go to System Preferences -> Accounts -> Login itemsกล่องกาเครื่องหมายซ่อนสำหรับแอปพลิเคชันนี้
anubhava

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

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