2009-03-07 9 views
8

Tôi muốn chạy [email protected] ứng dụng khách trên hộp Ubuntu 8.10 của tôi chỉ khi không hoạt động do tiêu thụ RAM nặng của chương trình.Lập kế hoạch trong Linux: chạy tác vụ khi máy tính không hoạt động (= không có người dùng nhập)

Bằng "nhàn rỗi", tôi có nghĩa là trạng thái khi không có hoạt động của người dùng (bàn phím, chuột hoặc bất kỳ người nào khác). Đó là ok cho các quá trình khác (có thể nặng) để chạy vào thời điểm đó kể từ khi F @ H có ưu tiên CPU thấp nhất. Vấn đề là chỉ để cải thiện trải nghiệm người dùng và làm công việc nặng nhọc khi anh ta vắng mặt.

Làm cách nào để thực hiện việc này?

Trả lời

12

Khi máy đang bàn là máy tính để bàn, bạn có thể móc đoạn mã bắt đầu/dừng vào trình bảo vệ màn hình để quá trình này dừng khi bảo vệ màn hình không hoạt động và ngược lại.

+1

xscreensaver cho phép làm cho nó bằng xscreensaver-command-watch (xem http://www.jwz.org/xscreensaver/faq.html # watch) – wheleph

+0

Bài viết về điều đó: http://wheleph.github.io/2009/12/20/fah-xsreensaver/ – wheleph

+0

Tại sao mọi câu trả lời giả định rằng một trình bảo vệ màn hình được cài đặt? – Bulletmagnet

1

Tệp /proc/loadavg có tải hệ thống hiện tại. Bạn chỉ có thể viết một kịch bản bash để kiểm tra nó, và nếu nó thấp sau đó chạy lệnh. Sau đó, bạn có thể thêm nó vào /etc/cron.d để chạy định kỳ.

Tệp này chứa thông tin về tải hệ thống. Ba số đầu tiên đại diện cho số lượng hoạt động tác vụ trên hệ thống - các quá trình mà thực sự đang chạy - tính trung bình trên trong 1, 5 và 15 phút qua. Mục nhập tiếp theo hiển thị tức thời số tác vụ hiện tại - quy trình hiện được lên lịch để chạy thay vì bị chặn trong một cuộc gọi hệ thống - và tổng số quy trình trên hệ thống. Mục nhập cuối cùng là ID tiến trình của quy trình mà gần đây nhất đã chạy.

đầu ra Ví dụ:

0.55 0.47 0.43 1/210 12437 
+0

tải không hiển thị overcommitment nặng, sử dụng hoán đổi, vv Họ không phải là một viên đạn bạc cho việc này loại quyết định trong một chương trình. –

4

Đó là khó sử dụng để sắp xếp cho quá trình này chỉ được hiện khi hệ thống là khác nhàn rỗi.

Thực sự bắt đầu chương trình trong những điều kiện đó không phải là khó khăn. Bạn phải sắp xếp chương trình để tắt hoàn toàn, và tìm hiểu cách thức và thời điểm thực hiện.

Bạn phải có khả năng phân biệt giữa việc sử dụng CPU của chính quy trình đó và của các chương trình khác có thể đang chạy, để bạn có thể biết liệu hệ thống có "không hoạt động" đúng hay không.

Đó là dễ dàng hơn cho quy trình chỉ được được lên lịch khi hệ thống không hoạt động. Chỉ cần sử dụng lệnh 'đẹp' để khởi chạy ứng dụng Folding @ Home.

Tuy nhiên điều đó sẽ không giải quyết được vấn đề thiếu RAM. Nếu bạn đã kích hoạt không gian hoán đổi, hệ thống sẽ có thể hoán đổi bất kỳ quy trình ưu tiên thấp nào để chúng không tiêu thụ và tài nguyên thực, nhưng hãy cẩn thận với một hit lớn trên đĩa I/O mỗi khi ứng dụng Folding @ Home của bạn hoán đổi trong và ngoài RAM.

p.s. RAM rất rẻ tại thời điểm này ...

p.p.s. xem này article

+0

Làm thế nào là điều này 'khó sử dụng' nếu viết một cái gì đó giống như BOINC? :) –

+0

Điều gì là không mong muốn là không dự đoán trạng thái của hệ thống khi bạn đã hoàn tất, mà tôi đã cố gắng trả lời. –

+0

Cảm ơn câu trả lời của bạn, Alnitak. Tôi đã làm rõ ý nghĩa của "nhàn rỗi" trong câu hỏi. – wheleph

2

Bạn sẽ muốn xem xét một vài điều để xác định 'nhàn rỗi' và cũng khám phá cuộc gọi sysinfo() (liên kết chỉ ra sự khác biệt trong cấu trúc mà nó điền giữa các phiên bản hạt nhân khác nhau).

Linux không quản lý bộ nhớ theo cách thông thường. Đừng chỉ nhìn vào tải, nhìn vào bộ nhớ. Đặc biệt,/proc/meminfo có một dòng tuyệt vời bắt đầu với Committed_AS, nó cho bạn thấy bao nhiêu bộ nhớ mà hạt nhân thực sự đã hứa với các tiến trình khác. So sánh điều đó với những gì bạn đã học được từ sysinfo và bạn có thể nhận thấy rằng trung bình tải một phút là 0.00 không có nghĩa là thời gian chạy một số chương trình muốn cấp phát bộ nhớ 256MB, vì hạt nhân có thể thực sự bị bán quá mức. Lưu ý, tất cả các giá trị được điền bởi sysinfo() có sẵn thông qua/proc, sysinfo() chỉ là một cách dễ dàng hơn để lấy chúng.

Bạn cũng sẽ muốn xem lượng thời gian mà mỗi lõi đã chi tiêu trong IOWAIT kể từ khi khởi động, đó là một chỉ báo mạnh mẽ hơn nữa nếu bạn nên chạy một tài nguyên I/O. Lấy thông tin đó trong/proc/stat, dòng đầu tiên chứa tổng số của tất cả các CPU. IOWAIT đang ở trong lĩnh vực thứ 6. Tất nhiên nếu bạn có ý định thiết lập mối quan hệ với một CPU duy nhất, chỉ có CPU đó sẽ được quan tâm (nó vẫn là trường thứ sáu, theo đơn vị USER_HZ hoặc thường ở mức 100 'giây). Trung bình so với btime, cũng được tìm thấy trong/proc/stat.

Tóm lại, không chỉ xem xét trung bình tải.

EDIT

Bạn không nên giả định thiếu người dùng nhập vào có nghĩa là nhàn rỗi .. cron có xu hướng chạy .. dịch vụ công được đánh thuế bất cứ lúc nào, vv Nhàn rỗi vẫn đoán tốt nhất của bạn dựa trên đọc các giá trị (hoặc có thể nhiều hơn) mà tôi liệt kê ở trên.

EDIT 2

Nhìn vào các giá trị núm trong/proc/sys/vm cũng cung cấp cho bạn một dấu hiệu tốt về những gì người dùng nghĩ là nhàn rỗi, trong swappiness cụ thể. Tôi nhận ra rằng bạn chỉ thực hiện việc này trên hộp của riêng bạn nhưng đây là một wiki có thẩm quyền và tiêu đề câu hỏi là chung chung :)

+0

Cảm ơn những ý tưởng thú vị, tinkertim. Tôi đã sử dụng từ "nhàn rỗi" theo nghĩa khác mà tôi đã làm rõ trong câu hỏi. – wheleph

+0

Với cron và những thứ khác, bạn không thể mô tả nhàn rỗi theo cách đó. Thiếu đầu vào của người dùng KHÔNG có nghĩa là không hoạt động, đặc biệt khi 'updateb' chạy vào giữa đêm. –

+1

bạn sẽ lưu ý rằng trước khi bạn chỉnh sửa, ông đã làm rõ rằng anh ấy không bận tâm về các tác vụ 'nền' khác, chỉ phản hồi tương tác. – Alnitak

4

có thể Bạn cần phải đặt mức độ ưu tiên thấp nhất cho tác vụ nhàn rỗi thông qua giao diện đẹp.

+0

Đây thực sự là cách bạn nên làm điều này trên Linux. – Arafangion

+0

Vấn đề với ưu tiên quá trình là nó chỉ là CPU và những ngày này đĩa thường là vấn đề chính –

+0

topicstarter nói về sử dụng RAM heave nhưng không có gì về việc sử dụng đĩa –

0

Xem chủ đề này cho tập lệnh perl kiểm tra khi hệ thống ở chế độ chờ (thông qua bảo vệ màn hình gnome).
Bạn có thể chạy các lệnh khi không hoạt động bắt đầu và dừng.
Tôi đang sử dụng tính năng này với một số tập lệnh để thay đổi tùy chọn BOINC khi đang chạy không tải
(để cung cấp cho BOINC nhiều bộ nhớ và cách sử dụng CPU).

perl script on ubuntu forums