Смотри здесь
Есть два сигнала, которые могут приостановить выполнение процесса. Один «грациозен», а другой «силен».
«Изящный» - это один SIGTSTP
, и его цель состоит в том, чтобы «приятно» попросить процесс, если ему это нравится, приостановить выполнение, пока не получит a SIGCONT
. В случае SIGTSTP
, процесс может игнорировать SIGTSTP и продолжить выполнение в любом случае, так что это требует сотрудничества со стороны программы, которая предназначена для обработки SIGTSTP.
Он является «принудительным» SIGSTOP
, и его целью является приостановка всех потоков пользовательского пространства, связанных с этим процессом. Для процесса так же невозможно игнорировать, SIGSTOP
как и для него игнорировать SIGKILL
(последний принудительно убивает процесс).
Чтобы отправить произвольный сигнал, в том числе и любой из них , упомянутых здесь, вы можете использовать программы , такие как kill
, killall
или pkill
; или используйте системный вызов kill(2)
. Обратитесь к руководствам вашей операционной системы, чтобы узнать подробности, связанные с платформой / архитектурой / версией, и сведениями, касающимися любого из перечисленного Обратите внимание, что слово «kill» во всех этих командах и системном вызове является неправильным. Эти команды не предназначены исключительно для завершения процессов. Они могут сделать это, отправив определенные сигналы; но сигналы также могут использоваться для других функций, кроме завершения процесса. Например, SIGSTOP
только приостанавливает процесс, и это только один из нескольких сигналов, которые могут быть отправлены таким образом.
Чтобы добавить условие автоматического возобновления процесса по истечении определенного периода времени, вам нужно будет использовать какой-то процесс мониторинга, который остается запущенным и устанавливает таймер, чтобы активировать процесс мониторинга, который затем, в свою очередь, вызывает kill(2)
и отправляет SIGCONT
сигнал остановленному процессу, чтобы запросить ядро возобновить выполнение. Обратите внимание, что в Linux есть несколько механизмов синхронизации с различной степенью точности; Более того, если ваша система очень занята, ваш процесс мониторинга может не проснуться до тех пор, пока не истечет его таймер, и, следовательно, пробуждение может быть отложено.
Если вы зависите от очень точной точности приостановки и возобновления приостановленного процесса, возможно , потребуется запустить программу мониторинга с правами доступа в режиме реального времени (см этой страницы руководства на sched_setscheduler(2)
информацию о том , чтобы ваш процессе в режиме реального времени). Вы также можете использовать таймеры высокого разрешения, функцию ядра Linux (которая доступна только в том случае, если ваше оборудование обеспечивает их поддержку), в сочетании с планированием в реальном времени, чтобы получить очень точную точность с точностью до миллисекунды, а затем включите и отправьте сигнал для возобновления отслеживаемого процесса очень быстро.
Вы не указали, какие технологии вы хотите использовать для реализации этого. Как минимум, вам понадобится, по крайней мере, сценарий bash, хотя вы не сможете получить очень точную синхронизацию таким образом. Вот bash-скрипт (непроверенный, поэтому, пожалуйста, будьте осторожны), который является просто доказательством концепции вашего запроса. Если вам нужно точное время, вам придется написать программу, возможно на C / C ++ или другом родном языке, и использовать планирование в реальном времени и hrtimers.
#!/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}"
Обратите внимание, что сценарий завершится, а управляющий сценарий завершится, но из-за screen
управления процессом монитора он продолжит работать в фоновом режиме в течение 10 секунд (на основе переданного аргумента sleep
), а затем активируется и продолжит дочерний процесс. Но это будет долго после того, как управляющий скрипт закончится. Если вы хотите синхронно ждать истечения времени, просто пропустите второй вызов screen
и жестко закодируйте сон и уничтожение в управляющем скрипте.
Вы можете проверить, что процесс на самом деле приостанавливается, запустив
screen -rS child
после запуска этого скрипта. Вы не увидите ничего на консоли. Затем, после истечения таймера (10 секунд), он заполнит ваш экран данными base64 (случайные символы от 0 до 9 и AF). Нажмите Ctrl + C, чтобы выйти.