Làm thế nào để tôi điều tiết một lệnh trong một cửa sổ đầu cuối?


8

Tôi cần phải chạy convertvới rất nhiều hình ảnh cùng một lúc. Lệnh mất khá nhiều thời gian nhưng điều này không làm phiền tôi.

Vấn đề là lệnh này khiến máy tính của tôi không sử dụng được trong khi lệnh đang chạy (trong khoảng 15 phút).

Vì vậy, có thể điều tiết lệnh bằng cách giới hạn tài nguyên (bộ xử lý và bộ nhớ) cho lệnh, trực tiếp từ dòng lệnh? Điều này chỉ có thể hoạt động nếu tôi thêm một cái gì đó vào cùng một dòng trước khi nhấn Enterbởi vì một khi tôi bắt đầu quá trình, máy tính sẽ chậm đến mức không thể chuyển sang "Màn hình hệ thống" và giảm mức độ ưu tiên.

Chỉnh sửa: kết quả hàng đầu và iotop

Tôi quản lý để chạy topsudo iotop >iotop.txttrong khi thực hiện một trong những hoạt động chuyển đổi. (Tệp iotop.txt được tạo ra rất khó đọc)

Kết quả hàng đầu:

   NGƯỜI DÙNG PR PR VI VIRT RES SHR S% CPU% MEM TIME + HÀNH           
14275 tên người dùng 20 0 4043m 3.0g 1448 D 7.0 80.4 0: 16,45 chuyển đổi 

Kết quả của iotop:

[? 1049h [1; 24r (B [m [4l [? 7h [? 1h = [39; 49m [? 25l [39; 49m (B [m [H [2JTotal DISK READ: 1269.04 K / s | Total DISK WRITE) : [59G0,00 B / s
(B [0; 7m TID PRIO USER DISK READ DISK WRITE SWAPIN (B [0; 1; 7m IO> (B [0; 7m LỰA CHỌN [3; 2H (B [m2516 be / 4 tên người dùng 350,08 K / s 0,00 B / s 0,00% 0,00% zeitgeist-datahub
 7394 be / 4 tên người dùng 568,88 K / s 0,00 B / s 77,41% 0,00% --rendere ~ .530483991 [5; 1H14275 tên người dùng nhàn rỗi 350,08 K / s 0,00 B / s 37,49% 0,00% chuyển đổi S ~ f test.pdf [6 ; 2H2048 được / 4 gốc [6; 24H0,00 B / s 0,00 B / s 0,00% 0,00% [kworker / 3: 2]
[5G1 được / 4 gốc [7; 24H0,00 B / s 0,00 B / s 0,00% 0,00% init

Hơn nữa, ngay cả sau khi quá trình kết thúc, máy tính không trở lại hiệu suất trước đó. Tôi tìm thấy một cách xung quanh điều này bằng cách chạy sudo swapoff -atheo sausudo swapon -a

Câu trả lời:


5

Ôi, chàng trai, tôi vừa bắt gặp ... trích dẫn OP:

Hơn nữa, ngay cả sau khi quá trình kết thúc, máy tính không trở lại hiệu suất trước đó. Tôi tìm thấy một cách xung quanh điều này bằng cách chạy sudo swapoff -atheo sausudo swapon -a

OK, điều đó có nghĩa là bạn đã làm cạn kiệt RAM có sẵn trên hệ thống của mình, điều đó có nghĩa là bạn chỉ đang cố gắng chạy quá nhiều converttiến trình cùng một lúc. Chúng tôi cần xem xét cú pháp thực tế của bạn convertđể sinh sản để tư vấn, nhưng về cơ bản, bạn cần đảm bảo rằng bạn không cố gắng mở nhiều quy trình đồng thời hơn là bạn có RAM để xử lý thoải mái.

Vì bạn nêu rõ nguyên nhân gây ra điều này convert *.tif blah.pdf, điều xảy ra là nội dung của mỗi TIF đơn lẻ và chuyển đổi thành PDF đang bị nhồi vào RAM cùng một lúc. Những gì bạn cần làm là phân chia công việc để không cần thiết. Thay vào đó find . -iname '*.tif' | xargs -I% convert % %.pdf, một khả năng nhảy vọt là làm một cái gì đó như thế , sau đó sử dụng pdftkhoặc một cái gì đó tương tự để dán tất cả các pdf riêng lẻ lại với nhau. Nếu bạn thực sự muốn có được sự ưa thích và bạn có CPU đa lõi, điều này cũng cho bạn cơ hội để viết một tập lệnh nhỏ để chạy các chuyển đổi theo lô n , trong đó n là số lõi của bạn và hoàn thành công việc nhanh hơn đáng kể . :)

pdftk cách thực hiện: http://ubfoxhowtos.com/howtos/merge_pdf_files (về cơ bản sôi xuống sudo apt-get install pdftk; pdftk *.pdf cat output merged.pdf)


Tôi chỉ đang chạy MỘT convert *.tif bla.pdftiến trình tại một thời điểm, nhưng đầu vào là cả đống hình ảnh tif. Đó là một cách để tạo một pdf từ một loạt các hình ảnh hoạt động tốt nhưng bóp nghẹt máy tính của tôi.
Làm

^^ xem câu trả lời đã được chỉnh sửa :)
Jim Salter

Điều này làm việc hoàn hảo với một sửa đổi đơn giản. find . -iname '*.tif' | xargs -I% convert % %.pdfthay vì find . -iname '*.pdf' | xargs -I% convert % %.pdf. Nó cũng nhanh hơn! Cảm ơn.
Làm

Xin lỗi, trục trặc giữa não và ngón tay :-)
Jim Salter

Một sửa đổi nhỏ là một điều tốt để biết về -exec-execdircác tùy chọn cho find. Trong trường hợp của bạn, thay vì sử dụng xargs, tôi sẽ sử dụng:find -iname '*.tif' -execdir convert {} {}.pdf ';'
Paddy Landau

12

man nice, Và nếu bạn cần I / O throttling man ionice.

Hãy xem xét một số ví dụ đơn giản.

Sử dụng CPU điều tiết:

you@box:/$ nice -n 10 /usr/bin/convert blah.gif blah.jpg

Từ mô tả của bạn, tuy nhiên, việc sử dụng CPU gần như chắc chắn không phải là vấn đề thực sự của bạn ở đây. Nhiều khả năng, bạn đang có sự tranh chấp I / O nghiêm trọng.

Sử dụng đĩa tiết lưu:

you@box:/$ ionice -c2 -n7 /usr/bin/convert blah.gif blah.jpg

-c2là "nỗ lực tốt nhất" và -n7là ưu tiên "nỗ lực tốt nhất" thấp nhất. Vì vậy, điều này sẽ điều tiết công việc để giảm mức ưu tiên I / O so với hầu hết những thứ khác trên hệ thống.

you@box:/$ ionice -c3 /usr/bin/convert blah.gif blah.jpg

-c3(không có mức độ ưu tiên cần thiết) có nghĩa là "Chỉ nhàn rỗi". Các công việc được đặt thành -c3CHỈ chiếm thời gian lập lịch đĩa nhàn rỗi, hầu như không ảnh hưởng gì đến hệ thống - nhưng có khả năng thời gian thực hiện lâu hơn đáng kể cho công việc của bạn, tùy thuộc vào mức độ bận rộn của hệ thống.


Làm thế nào tôi có thể tích hợp nicetrong một lệnh chuyển đổi? Nếu tôi không sai, hoạt động tốt cho các quy trình đã chạy.
Làm

1
Xem ở trên ... Ngoài ra, srsly, đọc trang người đàn ông. Đó là một trang người đàn ông rất dễ dàng, không chewy chút nào. :-)
Jim Salter

Tôi đã thử nó. Sắp xếp giúp đỡ nhưng không đủ. nice -n 20Lần sau tôi sẽ thử .
Làm

Thành thật mà nói tôi không chắc chắn rằng tải CPU là vấn đề của bạn ở đây. Bạn đã thử làm iotoptrong khi chạy quá trình? Thông thường, một quá trình tiêu thụ nhiều CPU sẽ ảnh hưởng rất ít đến khả năng sử dụng của hệ thống, nhưng quá trình phá hủy ổ cứng có thể RẤT nhanh chóng khiến mọi thứ phải dừng lại - đặc biệt là nếu bạn đang sử dụng ổ đĩa thông thường, không phải SSD.
Jim Salter

Vì toàn bộ hệ thống khá khó sử dụng đối với bạn, bạn có thể thử một cái gì đó dọc theo dòng convert blah.gif blah.jpg & iotopđể nó iotopsẽ khởi động ngay lập tức ngay khi bạn bắt đầu convertcông việc.
Jim Salter

2

Đây là một bài viết khá hay về việc sử dụng một chương trình được gọi cpulimitđể hạn chế việc sử dụng cpu của bất kỳ quy trình nào:

http://maketecheasier.com/limit-cpu-usage-of-any- Process-in-linux / 2010/09/22

Vấn đề giống như bạn nói khi tìm thấy PID của convertquá trình sau khi nó đã bắt đầu.

Sau khi bắt đầu convertnếu bạn vẫn có thể gõ các lệnh trong thiết bị đầu cuối, bạn có thể chạy ps aux | grep convertđể tìm nó, sau đó sudo cpulimit -p PID -l CPU%bắt đầu điều chỉnh.

Hoặc nếu bắt đầu convertcũng khóa thiết bị đầu cuối của bạn, bài viết cho bạn thấy cách bạn có thể chạy cpulimitnhư một trình nền nền sẽ tự động theo dõi và điều tiết mọi quá trình trong một lượng sử dụng CPU nhất định. Chúc may mắn!


Kịch bản này là một ý tưởng tồi và nguyên thủy so với nicelệnh tích hợp. cpulimitsẽ giới hạn quá trình sử dụng% CPU nhất định cho dù có bất kỳ thứ gì khác cần thời gian của CPU hay không; nice, ngược lại, đặt mức độ ưu tiên (tổng cộng 40!) cho phép mức độ ưu tiên của một nhiệm vụ trên (hoặc bên dưới) các nhiệm vụ khác.
Jim Salter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.