Xem tại đây
Có hai tín hiệu có thể đình chỉ việc thực hiện một quy trình. Một là "duyên dáng", và một là "mạnh mẽ".
Cái "duyên dáng" là SIGTSTP
, và mục đích của nó là "độc đáo" hỏi quá trình, nếu cảm thấy như vậy, vui lòng tạm dừng thực thi cho đến khi nhận được SIGCONT
. Trong trường hợp SIGTSTP
, quá trình có thể bỏ qua SIGTSTP và tiếp tục thực thi bằng mọi cách, vì vậy điều này đòi hỏi sự hợp tác từ một chương trình được thiết kế để xử lý SIGTSTP.
Cái "mạnh mẽ" là SIGSTOP
, và mục đích của nó là đình chỉ tất cả các luồng không gian người dùng liên quan đến quá trình đó. Quá trình này không thể bỏ qua SIGSTOP
vì nó bỏ qua SIGKILL
(sau đó sẽ giết chết quá trình một cách mạnh mẽ).
Để gửi một tín hiệu tùy ý, bao gồm bất kỳ trong những người đề cập ở đây, bạn có thể sử dụng các chương trình như kill
, killall
hoặc pkill
; hoặc sử dụng cuộc gọi hệ thống kill(2)
. Xem các trang của hệ điều hành của bạn để biết chi tiết về nền tảng / kiến trúc / phiên bản và lỗi phụ thuộc vào bất kỳ điều nào ở trên. Lưu ý rằng từ "giết" trong tất cả các lệnh này và tòa nhà là một cách viết sai. Các lệnh này không được thiết kế, độc quyền, để chấm dứt các quá trình. Họ có thể làm điều đó bằng cách gửi một số tín hiệu nhất định; nhưng tín hiệu cũng có thể được sử dụng cho chức năng khác hơn là chấm dứt một quá trình. Ví dụ: SIGSTOP
chỉ tạm dừng quá trình và đó chỉ là một trong một số tín hiệu có thể được gửi theo cách này.
Để thêm điều kiện tự động tiếp tục lại quá trình sau một khoảng thời gian, bạn sẽ cần sử dụng một số quy trình giám sát vẫn đang chạy và đặt hẹn giờ để đánh thức quá trình giám sát, sau đó lần lượt gọi kill(2)
lại và gửi SIGCONT
tín hiệu đến quá trình dừng, để yêu cầu kernel tiếp tục thực thi. Lưu ý rằng Linux có một số cơ chế thời gian với nhiều mức độ chính xác và chính xác khác nhau; hơn nữa, nếu hệ thống của bạn rất bận, quá trình giám sát của bạn có thể không được đánh thức cho đến khi hết giờ sau khi hết giờ, và do đó việc thức dậy có thể bị trì hoãn.
Nếu bạn phụ thuộc vào độ chính xác rất chính xác của hệ thống treo và nối lại các quá trình bị treo, bạn có thể cần phải chạy chương trình giám sát của bạn với các điều khoản real-time (xem manpage này trên sched_setscheduler(2)
để biết thông tin về việc xử lý của bạn theo thời gian thực). Bạn cũng có thể sử dụng độ phân giải cao Timers, một tính năng của hạt nhân Linux (mà chỉ có sẵn nếu phần cứng của bạn cung cấp hỗ trợ cho họ), kết hợp với lịch trình thời gian thực, để có được rất chính xác, phụ millisecond chính xác về thời gian, sau đó thức dậy và gửi tín hiệu để tiếp tục quá trình theo dõi rất nhanh.
Bạn đã không chỉ ra những công nghệ mà bạn sẵn sàng sử dụng để thực hiện điều này. Ở mức tối thiểu, bạn sẽ cần ít nhất bash scripting, mặc dù bạn sẽ không thể có được thời gian rất chi tiết theo cách đó. Dưới đây là một "tập lệnh" bash (chưa được kiểm tra, vì vậy hãy cẩn thận) đó chỉ là một bằng chứng về khái niệm truy vấn của bạn. Nếu bạn cần thời gian chính xác, bạn sẽ phải viết một chương trình, có thể bằng C / C ++ hoặc ngôn ngữ bản địa khác, và sử dụng lập lịch và hrtimers theo thời gian thực.
#!/bin/bash
#This is the process you want to suspend.
screen -mdS child bash -c "cat /dev/urandom | base64"
#This is the process ID of the child process
THEPID=$(screen -list | grep child | cut -f1 -d'.' | sed 's/\W//g')
#Send SIGSTOP to the child process.
kill -SIGSTOP ${THEPID}
#Now it is suspended. This process will sleep for 10 seconds asynchronously, then resume the process.
screen -mdS monitor bash -c "sleep 10; kill -SIGCONT ${THEPID}"
Lưu ý rằng tập lệnh sẽ kết thúc và tập lệnh kiểm soát sẽ chấm dứt, nhưng do screen
kiểm soát quá trình giám sát, nó sẽ tiếp tục chạy trong nền trong 10 giây (dựa trên đối số được truyền đến sleep
) và sau đó thức dậy và tiếp tục quá trình con. Nhưng điều này sẽ rất lâu sau khi kịch bản kiểm soát kết thúc. Nếu bạn muốn chờ đồng bộ thời gian trôi qua, chỉ cần bỏ qua cuộc gọi thứ hai screen
và mã hóa chế độ ngủ và giết vào tập lệnh kiểm soát.
Bạn có thể kiểm tra xem thực tế quá trình có bị đình chỉ bằng cách chạy không
screen -rS child
sau khi bạn bắt đầu kịch bản này. Bạn sẽ không thấy bất cứ điều gì trên bảng điều khiển. Sau đó, sau khi hết giờ (10 giây), nó sẽ tràn vào màn hình của bạn với dữ liệu cơ sở64 (ký tự ngẫu nhiên từ 0-9 và AF). Nhấn Ctrl + C để thoát.