Có cách nào để tạm dừng một quá trình đang chạy trên các hệ thống Linux và tiếp tục lại sau này không?


37

Tôi phải sao chép tập tin trên máy. Và dữ liệu là vô cùng lớn. Bây giờ các máy chủ cần phục vụ bình thường và thường có một số giờ bận rộn cụ thể trên đó. Vì vậy, có cách nào để chạy các lệnh như vậy theo cách mà nếu máy chủ đạt đến giờ bận rộn, nó sẽ tạm dừng quá trình và khi nó ra khỏi phạm vi đó, nó có tiếp tục lại không?

Dự định-Kết quả

cp src dst

if time between 9:00-14:00 pause process
After 14:00 resume cp command.

22
rsync có thể tiếp tục chuyển một phần
Thorbjørn Ravn Andersen

2
Bạn có cần dữ liệu thực tế để được sao chép như một bản sao lưu? Nếu không, bạn có thể sử dụng cp -alđể làm một trang trại liên kết cứng? Hoặc sử dụng một hệ thống tập tin hỗ trợ phản xạ cấp khối với sao chép trên ghi, sử dụng cp -a --reflink=auto? BTRFS và ZFS hỗ trợ cho các bản sao trong cùng một thiết bị vật lý.
Peter Cordes

9
Có bất kỳ tập tin nào srcthay đổi trong khoảng thời gian từ 9:00 đến 14:00 không? Nếu vậy, chỉ cần tạm dừng và tiếp tục cpquá trình có thể dẫn đến các tệp bị hỏng. Có thể tốt hơn để chạy rsynckết hợp với timeoutlệnh.
Đánh dấu Plotnick

Các tập tin đang được sao chép từ đâu và đến đâu? Đây có phải là một hệ thống ảo? Hệ thống tập tin nguồn là gì? Mục đích của bản sao là gì?
Braiam

@Braiam Im sử dụng rsync và sao chép tệp từ xa cho máy cục bộ. Tôi chỉ sử dụng lệnh cp làm ví dụ ở đây btw
Sollosa

Câu trả lời:


7

Vâng, bạn cần phải

acquire the process id of the process-to-paus (PS), then do
$> kill -SIGSTOP <pid>

Quá trình sau đó sẽ hiển thị với Trạng thái "T" (PS). Tiếp tục làm một

$> kill -CONT <pid>

Chúc may mắn!


77

Bạn có thể tạm dừng thực thi một quy trình bằng cách gửi tín hiệu SIGSTOP và sau đó tiếp tục lại bằng cách gửi SIGCONT.

Giả sử khối lượng công việc của bạn là một quy trình duy nhất (không phải là trình trợ giúp rẽ nhánh chạy trong nền), bạn có thể sử dụng một cái gì đó như thế này:

# start copy in background, store pid
cp src dst &
echo "$!" >/var/run/bigcopy.pid

Sau đó, khi thời gian bận rộn bắt đầu, hãy gửi SIGSTOP:

# pause execution of bigcopy
kill -STOP "$(cat /var/run/bigcopy.pid)"

Sau đó, khi máy chủ không hoạt động trở lại, hãy tiếp tục lại.

# resume execution of bigcopy
kill -CONT "$(cat /var/run/bigcopy.pid)"

Bạn sẽ cần lên lịch cho thời gian cụ thể khi bạn muốn nó được thực thi, bạn có thể sử dụng các công cụ như bộ định thời cron hoặc systemd (hoặc nhiều công cụ tương tự khác) để lên lịch này. Thay vì lên lịch dựa trên khoảng thời gian, bạn có thể chọn theo dõi máy chủ (có thể xem mức trung bình tải, sử dụng cpu hoặc hoạt động từ nhật ký máy chủ) để đưa ra quyết định khi nào nên tạm dừng / tiếp tục sao chép.

Bạn cũng cần quản lý tệp PID (nếu bạn sử dụng một tệp), đảm bảo rằng bản sao của bạn thực sự vẫn đang chạy trước khi tạm dừng nó, có thể bạn sẽ muốn dọn sạch bằng cách xóa pidfile sau khi sao chép xong, v.v.

Nói cách khác, bạn cần nhiều hơn về điều này để làm cho đáng tin cậy, nhưng ý tưởng cơ bản về việc sử dụng các tín hiệu SIGSTOP và SIGCONT này để tạm dừng / tiếp tục thực hiện quy trình dường như là điều bạn đang tìm kiếm.



1
Có thể thêm một lời nhắc rằng bạn nên hết sức cẩn thận rằng '/var/run/bigcopy.pid' vẫn đề cập đến quy trình tương tự như bạn nghĩ. dừng ngẫu nhiên các quá trình khác trên hệ thống có thể không được mong muốn. Tôi biết không có cách nào an toàn để đảm bảo rằng pid đề cập đến chương trình mà bạn nghĩ nó làm mặc dù ...
Evan Benn

@EvanBenn Vâng, đó là ý của tôi theo cách "đảm bảo rằng bản sao của bạn thực sự vẫn đang chạy trước khi tạm dừng nó" mặc dù quan điểm của bạn chắc chắn rõ ràng hơn thế! Vâng, việc kiểm tra PID vốn dĩ là chủng tộc, vì vậy đôi khi không thể thực hiện được 100% một cách đáng tin cậy ...
filbranden

@cat Không thực sự, một quá trình không thể chặn SIGSTOP. Xem liên kết từ nhận xét đầu tiên: "SIGSTOP là tín hiệu không thể chặn như SIGKILL" (hoặc chỉ cần google, bạn sẽ thấy đó là trường hợp.)
filbranden

76

Thay vì tạm dừng quá trình, bạn cũng có thể ưu tiên thấp hơn:

renice 19 "$pid"

sẽ ưu tiên thấp nhất (độ đẹp cao nhất), do đó quá trình đó sẽ mang lại CPU cho các tiến trình khác cần nó hầu hết thời gian.

Trên Linux, điều tương tự có thể được thực hiện với I / O với ionice:

ionice -c idle -p "$pid"

Sẽ đặt tiến trình vào lớp "nhàn rỗi", để nó sẽ chỉ nhận được thời gian đĩa khi không có chương trình nào khác yêu cầu I / O đĩa trong một thời gian ân hạn xác định .


22
Đây là một trường hợp điển hình của một vấn đề XY . Câu hỏi là làm thế nào để tạm dừng một quá trình, nhưng điều này không trả lời câu hỏi. Mặc dù thực sự hạ thấp mức độ ưu tiên là cách tiếp cận tốt hơn cho vấn đề thực tế , nó không trả lời câu hỏi. Tôi sẽ chỉnh sửa câu hỏi để bao gồm cách tạm dừng một quá trình và tại sao tạm dừng có thể là một vấn đề (ví dụ: tệp có thể được chỉnh sửa trong khi tạm dừng).
MechMK1

22
@DavidStockinger, về mặt kỹ thuật, câu trả lời này cho biết cách yêu cầu HĐH tạm dừng quá trình khi nó (hệ điều hành, CPU, bộ lập lịch I / O) đang bận (ngay cả khi chỉ là phân số giây). Làm thế nào để đình chỉ quá trình một cách thủ công đã được đề cập trong các câu trả lời khác. Giải pháp này không giải quyết được vấn đề về các tệp bị sửa đổi trong khi chúng đang được sao chép.
Stéphane Chazelas

5
Thay đổi mức ưu tiên I / O không phải lúc nào cũng là giải pháp tốt nhất. Nếu bạn đang sao chép từ đĩa quay, bạn vẫn có thể phải tìm kiếm trước mỗi yêu cầu ưu tiên cao mà bạn sẽ không phải chịu nếu bạn tạm dừng hoàn toàn thao tác ưu tiên thấp.
Đánh dấu

2
Ưu tiên thấp hơn thậm chí không giải quyết vấn đề. Ngay cả khi hộp hoàn toàn không hoạt động trong vài giây hoặc vài phút, điều đó không có nghĩa là một quá trình sao chép khổng lồ sẽ đuổi mọi thứ khỏi bộ đệm của hệ thống tập tin sẽ không gây khó chịu. Ngay khi có tải lại, nó sẽ rất chậm để phân trang lại mọi thứ.
R ..

2
@DavidStockinger cách xử lý các vấn đề XY ưa thích là đưa ra giải pháp phù hợp , ngay cả khi đó không phải là câu hỏi đang được yêu cầu. Khi bạn biết cách tiếp cận được mô tả trong câu hỏi là sai, thì một câu trả lời tốt không đưa ra cách tiếp cận sai đó mà thay vào đó là cách tiếp cận tốt hơn.
terdon

8

Sử dụng rsync, quên cp, cho kịch bản này. có các thông số để giới hạn băng thông, hoặc có thể bị giết / dừng và bắt đầu sau, theo cách nó sẽ tiếp tục, nơi nó để lại ví dụ / s rsync


3

Nếu bạn định làm điều đó bằng cách làm gián đoạn quá trình đang chạy, tôi khuyên bạn nên chơi với chương trình Màn hình. Tôi đã không sử dụng Linux trong một thời gian, nhưng IIRC chỉ tạm dừng lệnh và tiếp tục lại sau đó khiến bạn khá dễ bị tổn thương, nếu bạn vô tình bị đăng xuất, bạn sẽ không thể tiếp tục phiên của mình.

Với màn hình tôi tin rằng bạn có thể làm gián đoạn phiên sau đó tách nó ra và đăng xuất. Sau đó, bạn có thể quay lại và gắn lại vào phiên đó. Bạn sẽ phải chơi với nó một chút nhưng nó làm cho các phiên mạnh mẽ hơn nhiều.

Bạn cũng có thể đăng xuất và về nhà sau đó đăng nhập từ xa, gắn lại vào hệ thống y bạn đã bắt đầu trong văn phòng và tiếp tục lại cho buổi tối, sau đó lấy lại vào ngày hôm sau tại nơi làm việc.


Tôi đã sử dụng tmux cho tha. Nhưng tôi đang viết một kịch bản có thể tự nhận thức hoặc tốt nhất là nhận biết môi trường, vì vậy nó sẽ dừng nếu máy chủ có tốc độ cao và tiếp tục khi nó bình thường.
Sollosa

0

Nếu hệ vỏ của bạn hỗ trợ nó (hầu như tất cả đều được), bạn có thể nhấn ^ Z (Ctrl + Z) để dễ dàng gửi SIGTSTPtín hiệu đến tác vụ nền trước, sau đó tiếp tục với fg(trên nền trước) hoặc bg(trên nền).

Nếu bạn thực hiện việc này trên nhiều tác vụ và muốn quay lại với chúng sau này, bạn có thể sử dụng jobslệnh, sau đó quay lại với fg/bg %#, trong đó # là số được đưa ra trong ngoặc trong công việc.

Hãy nhớ rằng SIGTSTPcó một chút khác biệt so với SIGSTOP(được sử dụng cho tất cả các câu trả lời khác), quan trọng nhất là do thực tế là nó có thể bị bỏ qua (nhưng tôi không thấy một chương trình nào bỏ qua nó ngoài sl). Thông tin chi tiết có thể được tìm thấy trong câu trả lời này trên StackOverflow .


Ngạc nhiên vì chưa có câu trả lời nào đề cập đến điều này.
Ave

Ty Ave, tôi biết thủ thuật đa nhiệm này. Nhưng để điều đó xảy ra, một người cần có thiết bị đầu cuối, trong khi tôi phải xây dựng một kịch bản sẽ tự thực hiện công việc, bất kể phải mất nhiều ngày.
Sollosa

@Sollosa nó có thể hữu ích cho những người khác có cùng câu hỏi và với quyền truy cập vào một thiết bị đầu cuối.
Ave

Tôi đồng ý. Rất vui được biết bạn Ave :)
Sollosa
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.