Можно ли временно заморозить процесс в Linux?

Мне было интересно, есть ли способ заморозить какой-либо процесс за определенное количество времени?

Что я имею в виду: возможно ли, чтобы одно приложение (возможно, выполнялось как root) приостановило выполнение другого уже запущенного процесса (любой процесс, как графический интерфейс, так и командную строку), а затем возобновить его позже? Другими словами, я не хочу, чтобы определенные процессы планировались планировщиком linux в течение определенного времени.

49 голосов | спросил Pal Szasz 10 +04002012-10-10T18:10:22+04:00312012bEurope/MoscowWed, 10 Oct 2012 18:10:22 +0400 2012, 18:10:22

3 ответа


77

Смотрите здесь

Есть сигналы two , которые могут приостановить выполнение процесса. Один из них «изящный», а один «силен».

«Изящный» - это SIGTSTP, и его цель - «приятно» спросить процесс, если ему это нравится, чтобы приостановить выполнение, пока он не получит SIGCONT. В случае SIGTSTP, процесс может игнорировать SIGTSTP и продолжать выполнение в любом случае, поэтому для этого требуется сотрудничество с программой, предназначенной для обработки SIGTSTP .

«Силовым» является SIGSTOP, и его цель - приостановить все потоки пользовательского пространства, связанные с этим процессом. Для процесса так же невозможно игнорировать SIGSTOP, поскольку он должен игнорировать SIGKILL (последний сильно убивает процесс).

Чтобы отправить произвольный сигнал, включая любой из упомянутых здесь, вы можете использовать такие программы, как kill, killall, или pkill; или используйте системный вызов kill(2). Ознакомьтесь с файлами вашей операционной системы для информации о платформе /архитектуре /версии и ошибках, относящихся к любому из вышеперечисленных. Обратите внимание, что слово «kill» во всех этих командах и syscall - плохое неправильное обозначение. Эти команды не предназначены исключительно для прекращения процессов. Они могут сделать это, отправив некоторые из сигналов; но сигналы могут также использоваться для других функций, кроме прекращения процесса. Например, SIGSTOP только приостанавливает процесс, и это всего лишь один из нескольких сигналов, которые можно отправить таким образом.

Чтобы добавить условие автоматического возобновления процесса по истечении определенного периода времени, вам нужно будет использовать какой-то процесс мониторинга, который остается запущенным, и устанавливает таймер, чтобы разбудить процесс мониторинга, который затем в свою очередь вызывает kill(2) и отправляет сигнал SIGCONT к остановленному процессу, чтобы попросить ядро ​​возобновить выполнение. Обратите внимание, что Linux имеет несколько механизмов синхронизации с различной степенью точности и точности; кроме того, если ваша система очень занята, ваш процесс мониторинга может не проснуться до тех пор, пока не истечет срок его таймера, и, следовательно, пробуждение может быть отложено.

Если вы полагаетесь на очень точную точность приостановки и возобновления приостановленного процесса, вам может потребоваться запустить вашу программу мониторинга с разрешениями в режиме реального времени (см. this manpage on sched_setscheduler(2) для получения информации о создании вашего процесса в режиме реального времени). Вы также можете использовать High-Resolution Timers, функцию ядра Linux (которая доступна только в том случае, если ваше оборудование поддерживает их) в сочетании с планированием в реальном времени, чтобы получить very -millisecond точность по времени, затем пробуждение и отправить сигнал, чтобы возобновить контролируемый процесс очень быстро.

Вы не указали, какие технологии вы хотите использовать для реализации этого. На минимальном уровне вам понадобится, по крайней мере, 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 секунд), он наполнит ваш экран базовыми данными (случайные символы от 0 до 9 и A-F). Нажмите Ctrl + C, чтобы выйти.

ответил allquixotic 10 +04002012-10-10T18:23:19+04:00312012bEurope/MoscowWed, 10 Oct 2012 18:23:19 +0400 2012, 18:23:19
12

Да, вы можете это сделать, отправив сигнал STOP на процесс, чтобы приостановить его, а затем CONT , чтобы продолжить.

использование:

kill -STOP <pid>

kill -CONT <pid>
ответил 15 Jam1000000amWed, 15 Jan 2014 04:14:07 +040014 2014, 04:14:07
10

Если у вас есть неплохое определение «замораживание», вы можете проверить команду renice.

Renice позволяет вам изменить приоритет планирования запущенных процессов.

Нормальное значение nice процесса равно 0. Увеличение приятного значения делает процесс более приятным, например, «почему бы вам не пойти первым». Уменьшение приятного значения делает процесс менее приятным, так как «убирайтесь с моего пути, я спешу». Хороший диапазон значений - от -20 до 19.

Любой может сделать свои собственные процессы более приятными. Только root может сделать процесс менее приятным или изменить привлекательность других пользователей.

Если вы установите значение nice процессов равным 19, оно будет работать только тогда, когда ничего не хочет в системе.

Вот пример, выполняемый в локальном ящике Linux.

Используйте ps -l и посмотрите на столбец NI, чтобы увидеть хорошее значение процессов.

- > ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY CMD
0 S 29190 402 31146 0 75 0 - 16547 wait pts /0 bash
0 T 29190 1105 402 0 75 0 - 23980 финиш pts /0 vim
0 R 29190 794 402 0 76 0 - 15874 - pts /0 ps

Запуск renice +10 в процессе vim заставляет его работать с более низким приоритетом.

- > renice +10 -p 1105
1105: старый приоритет 0, новый приоритет 10

- > ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY CMD
0 S 29190 402 31146 0 76 0 - 16547 wait pts /0 bash
0 T 29190 1105 402 0 95 10 - 23980 финиш pts /0 vim
0 R 29190 1998 402 0 78 0 - 15874 - pts /0 ps

Предполагая, что вы можете растянуть «заморозить», чтобы означать «не беспокоить кого-либо еще в системе», вы можете записать что-то вроде:

20% -ный & amp;
сон <определенное количество времени>
renase 0 -p & ltpid interest &

(не забудьте запустить его как root).


Заметьте, что я взял некоторые свободы с выводом ps -l, чтобы получить интересные столбцы, чтобы хорошо отображаться в маленьких синих квадратах: )

ответил Maurice 13 +04002012-10-13T06:21:48+04:00312012bEurope/MoscowSat, 13 Oct 2012 06:21:48 +0400 2012, 06:21:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132