Terminal.app และเซสชั่น tmux ไม่สามารถใช้คำสั่ง "เปิด" (โดยไม่ต้องใช้ tmux)


5

ฉันใช้ Terminal.app และtmuxเซสชัน

> open -a VLC file.mp4
The window server could not be contacted.  open must be run with a user logged in at the console, either as that user or as root.

หากไม่มีtmuxคำสั่งนี้จะใช้งานได้

ฉันค้นหาและพบว่าไม่สามารถใช้คำสั่ง 'open' ใน OSX tmux ได้ตั้งแต่วันที่ 10 กรกฎาคม 2558

brew update
brew install reattach-to-user-namespace
brew upgrade reattach-to-user-namespace
echo "set -g default-command \"reattach-to-user-namespace -l ${SHELL}\"" >> ~/.tmux.conf
cat .tmux.conf 
set -g default-command "reattach-to-user-namespace -l /bin/bash"

ฉันทำอย่างนั้นและยังคงมีข้อผิดพลาดเดียวกัน

The window server could not be contacted.  open must be run with a user logged in at the console, either as that user or as root.

reattach-to-user-namespace ควรทำอะไร?

คำตอบ:


12

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