คำสั่งเทอร์มินัล Mac OS X คือการออกจากระบบของผู้ใช้ปัจจุบันหรือไม่


19

ฉันต้องการเรียกใช้บางอย่างเช่น "sleep 3600; logout" แต่คำสั่ง logout bash จะปิดเทอร์มินัลปัจจุบันเท่านั้น ฉันจะปิดเซสชัน Mac OS X ทั้งหมดได้อย่างไร

คำตอบ:


22

Applescript ต่อไปนี้จะออกจากระบบผู้ใช้ปัจจุบัน:

tell application "System Events" to log out

คุณสามารถสรุปได้ด้วย bash alias โดยใช้osascriptคำสั่ง:

alias maclogout="osascript -e 'tell application \"System Events\" to log out'"

มันเหมือนกับการคลิก "> ออกจากระบบ [ชื่อผู้ใช้] ... " และจะออกจากระบบหลังจากรอ 2 นาที

นี้รวมกับsleepคำสั่งได้อย่างง่ายดาย:

alias delayedlogout="sleep 3600; maclogout"

.. หรืออาจรวมกันเป็นชื่อแทนเดียว:

alias delayedlogout="sleep 3600; osascript -e 'tell application \"System Events\" to log out'"

ใส่กัน การปรับปรุงเพื่อตอบคำถามอย่างถูกต้องคือการรวมสิ่งที่ไวยากรณ์ 'sleep' จะอยู่ใน applescript นอกจากนี้ฉันเข้าใจว่าโค้ดบรรทัดที่สองถูกวางจากเทอร์มินัล แต่ดังนั้นมันจึงหลีกเลี่ยงการอ้างคำพูดสองครั้งรอบ ๆ เหตุการณ์ของระบบโดยไม่จำเป็น
ศักดิ์สิทธิ์

@ จุดแข็งเกี่ยวกับคำสั่ง sleep คำพูดที่ต้องหลีกหนีในส่วน "เหตุการณ์ของระบบ" เป็นสิ่งจำเป็นเนื่องจากalias maclogout="..."
dbr

2
ฉันเพิ่งพบว่าการใช้คำสั่งในเทอร์มินัลจะไม่ปิด / ปิดระบบเนื่องจากเทอร์มินัลเองจะป้องกันการออกจากระบบเนื่องจากการทุบตีไม่ใช่กระบวนการปัจจุบัน สิ่งนี้สามารถแก้ไขได้โดยการทำ '(sleep 1; command) &' โดยที่ sleep เข้าคิวงานในพื้นหลังและตามเวลาที่เรียกใช้งานเทอร์มินัลไม่คิดว่ามันยุ่ง
Grzegorz Adam Hankiewicz

17

ไม่มีวิธี "ดี" ในการบันทึกผู้ใช้ปัจจุบันออกจากเทอร์มินัลใน OS X วิธีที่ยุ่งเหยิงคือการฆ่าloginwindowกระบวนการของผู้ใช้ มันจะฆ่ากระบวนการทั้งหมด (โปรแกรม) ที่ทำงานอยู่ภายใต้ชื่อผู้ใช้ของคุณ

การทำเช่นนี้เป็นกระบวนการสองขั้นตอน

  1. ในเทอร์มินัลเรียกใช้สิ่งนี้:

    ps -Ajc | grep loginwindow
    
  2. จากนั้นเรียกใช้

    sudo kill <pid>
    

    โดย<pid>ที่หมายเลขแรก (คอลัมน์ที่สอง) จากเอาต์พุตจากคำสั่งด้านบน

ใช้ sudo kill -9 เพื่อบังคับให้ kill กระบวนการที่ฉันต้องทำเพื่อให้มันใช้งานได้

ตัวอย่างเช่นถ้าเมื่อเอาต์พุตไปยังคำสั่งแรกคือ:

joshhunt    41     1    41 5e15c08    0 Ss     ??    3:13.09 loginwindow

จากนั้นฉันจะเรียกใช้sudo kill 41ป้อนรหัสผ่านแล้วออกจากระบบ

สิ่งนี้สามารถรวมกันเป็นนามแฝงทุบตี:

alias messylogout="ps -Ajc | grep loginwindow | grep -v grep | awk '{print \$2}' | sudo xargs kill"

คุณใช้sudo killall loginwindowไม่ได้เหรอ อย่างน้อยใน 10.7 loginwindowกระบวนการดูเหมือนว่าจะเปิดอีกครั้งทันทีแม้ว่า
Lri

3

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ช่วยฉันได้คำสั่งที่ฉันต้องการใน OS X 10.8 คือ:

ps -Ajc | grep loginwindow | awk '{print $2}' | sudo xargs kill -9

awkคำสั่งที่แตกต่างกันและkill -9เพื่อให้แน่ใจพรอมต์เข้าสู่ระบบแสดง


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

@Scott ถูกต้องฉันโพสต์ความคิดเห็นนั้นเร็วเกินไป
gronostaj

2

ฉันคิดว่าฉันได้พบคำตอบวิธีการอย่างสง่างามออกจากระบบของ Mac OS X โดยไม่ต้องรอ 2 นาที

ฉันพบว่าการกด Shift, ตัวเลือกและคำสั่งและการกด "q" จะออกจากระบบอย่างสง่างามและไม่ถาม "ถ้าคุณต้องการออกจากระบบ"

ดังนั้นฉันจึงเขียนรหัส AppleScript ผ่าน Automator ไปที่:

tell application "System Events"
     keystroke "q" using {command down, shift down, option down}
end tell

0

หากคุณเข้าสู่เชลล์เป็นผู้ใช้คนเดียวกับที่ล็อกอินเข้าสู่ gui ของ mac คุณสามารถออกคำสั่ง sudo-less ได้launchctl reboot logoutซึ่งเป็นการออกจากระบบของผู้ใช้อย่างมีประสิทธิภาพ มันมีข้อแม้ที่ไม่อนุญาตให้แอปที่กำลังออกจากการกระตุ้นให้มีการโต้ตอบในขณะที่เลิกอย่างไรก็ตามไม่ได้หมายความว่านี่เป็นสิ่งเดียวกับการฆ่าพวกเขาโดยสิ้นเชิงในฐานะkill(SIG TERM) หรือkill -9(SIG KILL)


0

ฉันขอยืนยันว่าวิธีที่ "ดีที่สุด" โพสต์ OS X 10.9 อาจเป็น launchctl gui/$(id -u <username>) bootout

เอกสารประกอบการโพสต์ OS X 10.9 สำหรับ launchctl พบได้โดยการรันlaunchctl helpแต่โดยพื้นฐานแล้วคำสั่งข้างต้นจะทำให้เซสชันชั่วคราวของผู้ใช้ขาด ทางเลือกอื่นจะทำการlaunchctl user/$(id -u <username>) bootoutลบเซสชันถาวรที่รัน daemons ของผู้ใช้ในขณะที่ผู้ใช้ไม่ได้ลงชื่อเข้าใช้

สิ่งนี้สามารถทดสอบได้โดยการเรียกใช้launchctl gui/$(id -u) bootoutซึ่งจะทำให้คุณออกจากระบบทันทีและทำให้ระบบแสดงหน้าต่างการเข้าสู่ระบบ (ด้วยความล่าช้า)


อย่างน้อยภายใต้ El Capitan คำสั่งที่ถูกต้องคือsudo launchctl bootout gui/XXXที่ซึ่งXXXเป็น ID ผู้ใช้ที่เป็นตัวเลข (UID) โปรดทราบว่า i) คำbootoutสั่งย่อยมาก่อนและ ii) $(id)ส่งคืนมากกว่า UID มาก
กล่องเสียง Decidua

อัปเดตเพื่อเรียก ID (id -u) อย่างถูกต้อง
Iain Henderson

0

ยูทิลิตี้ที่ดีในการเพิ่มไปยังเทอร์มินัลของคุณคือคำสั่งlogoutที่จะใช้เช่น:

logout UserName

นี่คือวิธีการ:

  1. แก้ไข. bash_profile ของคุณ

    nano ~/.bash_profile

  2. เพิ่มบรรทัดนี้:

    logout() {sudo launchctl bootout user/$(id -u "$1")}

  3. บันทึกไฟล์กด ctrl+x

  4. รีสตาร์ทเครื่อง

คุณพร้อมที่จะไป;)

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