Câu hỏi Có thể đặt X ngủ, để phần còn lại của hệ thống tỉnh táo không?


Hãy tưởng tượng một máy tính có hai chức năng:

  1. Máy chủ tệp và máy chủ web cục bộ, bắt buộc 24/7.
  2. Một máy chủ đồ họa cho một trung tâm truyền thông, chỉ cần thiết khi ai đó đang sử dụng nó.

Tôi đang xem xét việc xây dựng một cỗ máy như vậy để cho phép tôi khởi động một số đĩa ra khỏi màn hình nền cực kỳ thiếu năng lượng và thay thế trung tâm truyền thông Atom thế hệ thứ 2 chậm chạp của chúng tôi.

Vấn đề với việc xây dựng này là XBMC là một con thú ăn năng lượng. Còn lại với các thiết bị riêng của nó, CPU sẽ không bao giờ nhập bất cứ thứ gì thậm chí gần với trạng thái ngủ. Mọi thứ đã được cải thiện nhưng cách duy nhất để có hiệu quả là đặt nó vào giấc ngủ S3. Rõ ràng điều này tắt bất cứ thứ gì đang chạy. Chúng tôi hiện đang đánh thức qua USB (bộ thu IR).

S3 Sleep sẽ không thể thực hiện trên máy tính mới vì tôi muốn nó chạy các thứ máy chủ nhưng tôi muốn đặt máy chủ X (và tất cả các máy khách của nó) vào chế độ ngủ. Nếu có thể. Là nó?

Nếu không, tôi luôn có thể bỏ X nhưng điều đó sẽ làm mất trạng thái của XBMC và tôi muốn tránh điều đó. Nếu đó là phương pháp duy nhất, bạn có thể đề xuất một cách để khởi tạo lại X từ lệnh IR không? (Và theo cách không đụng độ với việc xử lý IR của XBMC).

Chú thích: Tôi hoàn toàn linh hoạt với chồng đồ họa. Hiện tại chỉ là X và nodm tải một phiên bản độc lập của XBMC nhưng nếu những gì bạn cần đòi hỏi cái gì khác, đó là tốt. Tôi cũng có thể kiểm tra điều này trước khi xây dựng một máy mới (trên máy hiện tại).


4
2018-05-24 09:55


gốc


kill -[STOP|CONT] <PID> trông giống như họ có thể hữu ích iff họ có thể làm việc trên cây xử lý và Tôi có thể kích hoạt CONT tín hiệu từ IR. - Oli♦


Các câu trả lời:


Tạm dừng một cây xử lý

Tôi đang ở nửa đường. tôi đã tìm thấy kill -STOP <PID> làm đóng băng một quá trình. Có một CONT phiên bản quá đánh thức nó. Do đó tôi có thể tìm và STOP các nodm xử lý cây với lệnh sexy này:

pstree -p $(ps ux | awk '/nodm$/ {print $2}') | grep -oP '\d+' | xargs kill -STOP

Và chúng ta có thể đánh thức tất cả các tiến trình đã dừng (đối với người dùng hiện tại) với:

ps ux | awk '$8 ~ /^T/ {print $2}' | xargs kill -CONT

Điều này thực sự có vẻ làm việc. Tôi vừa thử nghiệm nó và tôi ngạc nhiên rằng không phải X, XBMC hoặc tập tin nó đang chơi trên NFS (vâng điều này làm việc giữa video) dường như tâm trí rằng nó đang bị tạm dừng trong năm phút.

Tiếp tục từ IR

Đây là thử thách tiếp theo - làm cách nào tôi có thể khởi động lại các quy trình này từ IR? Vì điều này chúng ta cần irexec mà có thể chạy một lệnh tùy ý cho bất kỳ nút nào, bất kể những gì khác là lắng nghe lirc.

Chúng tôi cần một vài kịch bản để thực hiện điều này. Đầu tiên ~/.lircrc

begin
prog = irexec
button = *
config = ~/.resume &
end

~/.resume (điều này sẽ cần chmod +x ~/.resume chạy sau khi nó được tạo)

#!/bin/sh
ps ux | awk '$8 ~ /^T/ {print $2}' | xargs kill -CONT

Sau đó, tất cả những gì chúng ta cần làm là tải irexec. Để giữ cho nó không bị biến đổi khi lệnh STOP được chạy, chúng ta phải cắt bỏ quá trình ra khỏi cây hiện tại được thực hiện đơn giản với setsid. Trong trường hợp của tôi, tôi thêm những điều sau đây trước khi phóng của xbmc trong ~/.xsession:

setsid irexec

Bí ẩn cuối cùng: Làm cách nào để XBMC có thể chạy tập lệnh STOP thay vì ngủ?

Phần duy nhất mà tôi chưa giải quyết bây giờ là chạy XBMC để chạy một lệnh thay vì tắt. Đang tiến hành. Các tùy chọn duy nhất tôi có thể tìm thấy tại thời điểm này là tạo ra một bảo vệ màn hình tùy chỉnh Python cho XBMC mà dường như có thật khôngngu si đần độn (và tôi không thể làm cho nó hoạt động).


3
2018-05-24 10:30





Tôi không phải là chuyên gia xbmc nhưng nếu nó sử dụng Lirc để bắt các thông điệp IR bạn có thể thêm một cái gì đó như thế này để các tập tin ~ / .licrc hoặc / etc / lirc / lircrc để kích hoạt kịch bản của bạn.

  begin wakeupwait
       button = OK (of course you may prefer to use another button for that purpose) 
       prog = irexec
       config = <your wake-up script path>
       quit
  end wakeupwait

  begin
       button = OK (same button) 
       prog = irexec
       config = <your pause script path>
       mode = wakeupwait
  end

Một số tài liệu:

irexec http://www.lirc.org/html/irexec.html

.lircrc http://www.lirc.org/html/configure.html (tùy chọn chế độ đáng để đọc)

Emmanuel


1
2018-05-24 11:57



Yup, tìm thấy điều này một cách riêng biệt. Dường như làm công việc nhưng nó phải được nạp bên ngoài vòng lặp X (trong trường hợp này) hoặc nó sẽ bị treo quá. - Oli♦
một cách để làm điều đó là sử dụng lệnh batch: lệnh echo | hàng loạt - Emmanuel