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, --install   Installes 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