คำสั่งควรย้ายกระบวนการ tmux จากบริบท bootstrap ที่สร้างขึ้นใหม่ภายใต้รูทไปยังบริบท bootstrap ล็อกอินของผู้ใช้
เพื่ออธิบายว่าในแง่ทั่วไปเล็กน้อย:
macOS (ก่อนหน้านี้ OS X) สร้างขึ้นด้วย Mach-kernel ที่ชั้นล่างสุด โปรแกรมที่ทำงานที่เลเยอร์นี้เรียกว่างาน
ด้านบนของ Mach-kernel คือระบบย่อย BSD โปรแกรมที่ดำเนินการในชั้นนี้เรียกว่ากระบวนการ แอปพลิเคชันที่คุณรันและรู้บน OS X (เช่น tmux หรือ Terminal.app) ใช้ระบบย่อย BSD ดังนั้นเมื่อใช้งานพวกเขากลายเป็นกระบวนการ
เมื่อโปรแกรมที่กำลังทำงาน (กระบวนการหรือภารกิจ) จำเป็นต้องสื่อสารกับกระบวนการ / งานอื่นผ่านพอร์ต Mach โปรแกรมนั้นจะผ่านงาน bootstrap ที่เรียกว่า ภารกิจระดับต่ำมากนี้มีหน้าที่รับผิดชอบในการค้นหาคำขอพอร์ต Mach และนำข้อมูลไปยังสถานที่ที่เหมาะสม
macOS / OS X เป็นระบบที่มีผู้ใช้หลายคนเป็นหลัก ผู้ใช้หลายคนสามารถเข้าสู่ระบบได้ในเวลาเดียวกันและผู้ใช้หลายคนสามารถเรียกใช้หลายกระบวนการ โดยทั่วไปแล้วพวกเขาจะไม่ได้รับอนุญาตให้ทำงานร่วมกันยกเว้นเมื่อได้รับอนุญาตอย่างชัดเจน
นอกเหนือจากกระบวนการผู้ใช้แล้วระบบจะบูต (และบางครั้งภายหลัง) เรียกใช้โปรแกรมพื้นหลังที่เรียกว่า daemons พวกเขาจะไม่เกี่ยวข้องกับการเข้าสู่ระบบของผู้ใช้ที่เฉพาะเจาะจงและทำงานต่อเมื่อผู้ใช้ออกจากระบบ
Mach bootstrap Mach ที่กล่าวถึงก่อนหน้านี้จัดกลุ่มงานทั้งหมดเป็น "บริบทเริ่มต้น" สำหรับโปรแกรม daemon หรือ "บริบทการเข้าสู่ระบบของผู้ใช้" มีหนึ่งหลังสำหรับผู้ใช้แต่ละคนที่เข้าสู่ระบบในปัจจุบัน
ในสาระสำคัญเมื่อโปรแกรมค้นหาพอร์ต Mach เพื่อสื่อสารผ่านพวกเขาสามารถเห็นได้เฉพาะพอร์ตในบริบทปัจจุบัน เมื่อคุณเริ่มโปรแกรมปกติจะเริ่มต้นในบริบทการเข้าสู่ระบบของผู้ใช้และทำให้คุณสามารถสื่อสารกับโปรแกรมอื่น ๆ ที่คุณเริ่มต้น
อย่างไรก็ตามกระบวนการ tmux ใช้ function call daemon () เพื่อ "daemonize" - กล่าวคือยังคงทำงานในพื้นหลัง สิ่งนี้ยังมีผลต่อการย้ายกระบวนการ tmux จากบริบทล็อกอินของผู้ใช้ไปยังบริบทเริ่มต้น
ขณะนี้โปรแกรมเช่น "เปิด" จะไม่ทำงานอีกต่อไปเพราะทำงานโดยค้นหาพอร์ต Mach ของ WindowServer สำหรับผู้ใช้ที่เข้าสู่ระบบในปัจจุบันและส่งคำสั่งเพื่อทำงานของพวกเขา การค้นหาจะล้มเหลวเนื่องจาก tmux อยู่ในบริบท bootstrap ที่ไม่ถูกต้อง
โปรแกรม reattach-to-user-namespace แก้ไขปัญหานี้โดยใช้วิธีการโต้ตอบกับกระบวนการเรียกใช้งาน uofficial (ซึ่งรับผิดชอบการจัดการกระบวนการ daemon) - เพื่อให้ launchd บอกว่าบริบทใดเป็นบริบทการล็อกอินของผู้ใช้
จากนั้นจะใช้การเรียกระบบ Mach task_set_bootstrap_port () เพื่อให้พอร์ตเพิ่มเติมดูจากกระบวนการ tmux (และกระบวนการลูกของมัน) จะตีงาน bootstrap บริบทการเข้าสู่ระบบของผู้ใช้
ทำไมมันถึงไม่ทำงานสำหรับคุณ: คุณจำได้ว่าต้องฆ่าและรีสตาร์ทเซิร์ฟเวอร์ tmux ของคุณหลังจากการติดตั้ง? (ทำได้โดยเรียกใช้ "tmux kill-server)
นอกจากนี้คุณสามารถลองเรียกใช้คำสั่ง reattach-to-user-namespace ด้วยตนเองจาก Terminal.app เพื่อดูว่าคุณได้ทำการติดตั้งจริง ๆ และทำงานอย่างถูกต้องหรือไม่
open
เพียงแค่บ่นสำหรับบางสิ่ง - ตัวอย่างเช่นการเปิดไดเรกทอรี (ใน Finder) หรือ URL (ในเบราว์เซอร์เริ่มต้นซึ่งในกรณีของฉันคือ Chrome) ทำไมถึงเป็นอย่างนั้น?