XWin.exe as Windows service
www.tanabutr.co.th/photobook
หมู่นี้ใช้วินโดวส์กับ cygwin และ coLinux (จะเขียนในอีกไม่นานวัน) วันนี้ก็เกิดไอเดียว่าน่าจะรัน X เซิร์ฟเวอร์ของ cygwin ซึ่งก็คือ XWin.exe เป็นเซอร์วิสของวินโดวส์ซะเลย. เวลาสตารท์เครื่องก็จะได้ไม่ต้องมาสั่ง startx หรือ XWin ให้วุ่นวาย. ลองหาทางเน็ตดูก็ไม่มีใครเขียนไว้แต่พอจะมีบอกใบ้ว่าใน cygwin นี้มีคำสั่ง cygrunsrv.exe เป็นคำสั่งที่ลงทะเบียนโปรแกรมใน cygwin เช่นเซิร์ฟเวอร์ apache, postmaster ฯลฯ ให้เป็นเซอร์วิสในวินโดวส์. มันก็น่าจะลงทะเบียน XWin.exe ให้เป็นเซอร์วิสในวินโดวส์ได้เหมือนกัน.
ก็เลยลองดูเลยเปิดหน้าจอ bash ของ cygwin ออกมา, แล้วดูว่า cygrunsrv มันใช้อย่างไร
$ man cygrunsrv No manual entry for cygrunsrv
ไม่เป็นไร, เรารู้ว่าคำสั่งที่ดีควรมีตัวเลือก --help อยู่ด้วยก็ลองดูต่อไป
$ cygrunsrv --help | less
พยายามจับมันเข้าไปในเพจเจอร์ less แต่สิ่งที่ออกมามันเป็น stderr อย่างนี้ต้องเอาใหม่อีกรอบ
$ cygrunsrv --help 2>&1 | less Usage: cygrunsrv [OPTION]... Main options: Exactly one is required. -I, --installInstalles a new service named . -R, --remove Removes a service named . -S, --start Starts a service named . -E, --stop Stops a service named . -Q, --query Queries a service named . Required install options: -p, --path Application path which is run as a service. Miscellaneous install options: -a, --args Optional string with command line options which is given to the service application on startup. -c, --chdir Optional directory which will be used as working directory for the application. -e, --env Optional environment strings which are added to the environment when service is started. You can add up to 255 environment strings using the `--env' option. Note: /bin is always added to $PATH to allow all started applications to find at least cygwin1.dll. ....
มีตัวเลือกให้เยอะแยะ แต่เราใช้ไม่กี่ตัวหรอก. ตัวอย่างเป็นคำสั่งรุ่นเก่า คำสั่งรุ่นใหม่จะมี -L สำหรับดูเซอร์วิสที่บันทึกด้วย. เราก็เริ่มบันทึก XWin ให้เป็น Windows service ด้วยคำสั่ง
$ cygrunsrv -I xwin -d "Cygwin XWin server" -p /usr/X11R6/bin/XWin -a "-multiwindow -clipboard -ac" -c /usr/X11R6/bin
ถ้าไม่มี error อะไรก็เป็นอันเรียบร้อย.
| -I | ระบุชื่อเซอร์วิส |
| -d | ใส่คำอธิบาย |
| -p | ใส่ชื่อพาธของโปรแกรมที่ต้องการรัน |
| -a | อาร์กิวเมนต์ของโปรแกรม ตรงนี้ก็ใช้ multiwindow ให้มันไม่แสดง root window, -clipboard ให้มัน cut & paste กับวินโดวส์ได้, -ac ปล่อยให้มันเปิดรับคำขอจากไคลเอ็นต์เครื่องอื่นๆได้ อันนี้จะเอาไว้ใช้กับ coLinux |
| -c | เปลี่ยนไดเรกทอรีไปที่ /usr/X11R6/bin เท่าที่ทดสอบมามันมี .dll ที่ต้องการอยู่เลยใช้ตัวเลือกนี้ด้วย. |
ใจร้อนก็อยากสตาร์ทเซอร์วิสนี้เลยก็ได้, ใช้คำสั่งของวินโดวส์ net start, net stop
$ net start xwin The Cygwin XWin server service is starting. The Cygwin XWin server service was started successfully.
มันบอกว่าเซอร์วิสเริ่มแล้ว ก็ลอง
$ export DISPLAY=:0 $ xlogo
ไม่ขึ้น!!! ปรกติถ้ารัน XWin -multiwindow ด้วยมือมันจะมีไอคอน X เล็กๆที่ system tray. แต่ตรงนี้ไม่มี. มั่วๆอยู่นานเลยรู้ว่าต้องไปเป็นเซอร์วิสของวินโดวส์, คลิ้กขวา My Computer เลือก manage... ไปที่ services
ดับเบิ้ลคลิ้กตรงเซอร์วิสที่สร้าง, ไปที่แท็บ Log on แล้วเลือก "Allow service to interact with desktop".
เสร็จแล้วเอาใหม่ จะ Stop แล้ว Start จาก Windows services เลยก็ได้หรือใช้คำสั่ง
$ net stop xwin $ net start xwin
แล้วก็จะเห็นไอคอน X ตรงมุมขวาด้านล่าง. แล้วก็ลอง xlogo ใหม่ก็จะเห็นว่าใช้การได้มีหน้าจอ xlogo เพื่อนซี้ผมขึ้นโชว์ตัว. ครั้งต่อไปบูตเครื่องแล้ว XWin ก็จะรันเป็น Windows service แล้วครับ.
Comments: blogger
