Смотри здесь
Есть два сигнала, которые могут приостановить выполнение процесса. Один «грациозен», а другой «силен».
«Изящный» - это один 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, чтобы выйти.
Да, вы можете сделать это, отправив сигнал STOP процессу, чтобы приостановить его, а затем CONT, чтобы продолжить.
использование:
источник
Если у вас есть достаточно свободное определение «заморозить», вы можете проверить
renice
команду.Renice позволяет изменить приоритет планирования запущенных процессов.
Обычное значение nice процесса равно 0. Увеличение значения nice делает процесс более приятным, как в «Почему бы вам не пойти первым». В то время как уменьшение значения nice делает процесс менее приятным, например, «убирайся с дороги, я спешу». Хороший диапазон значений от -20 до 19.
Любой может сделать свои собственные процессы приятнее. Только root может сделать процесс менее приятным или изменить процесс обработки других пользователей.
Если вы установите значение nice для процесса равным 19, оно будет запускаться только тогда, когда больше ничего не требуется в системе.
Вот пример запуска на моей локальной машине Linux.
Используйте
ps -l
и посмотрите на столбец NI, чтобы увидеть хорошее значение для процесса.Запуск
renice +10
процесса vim приводит к тому, что он запускается с более низким приоритетом.Предполагая, что вы можете растянуть «заморозить», чтобы означать «не беспокоить кого-либо еще в системе», вы можете написать что-то вроде:
(не забудьте запустить его как root).
обратите внимание, что я взял некоторые вольности с приведенным выше
ps -l
выводом, чтобы интересные столбцы хорошо отображались в маленьких синих прямоугольниках :)источник