Есть ли способ приостановить запущенный процесс в системах Linux и возобновить его позже?

Один из способов - использовать функцию вместо псевдонима - положить это в вашем .bashrc или .bash_profile -

sreq()
{
 ffmpeg -f x11grab -r 24 -s 1024x768 -i :0.0 -qp 0 -c:v libx264  -preset veryslow $1.mkv
}
38
21.02.2019, 14:37
6 ответов

Да, вам нужно получить идентификатор процесса для приостановки (с помощью команды ps), затем выполните:

$> kill -SIGSTOP <pid>

Затем процесс отобразится со статусом «T» (вps).

Чтобы продолжить, выполните:

$> kill -CONT <pid>
12
27.01.2020, 19:35

Если вы собираетесь это сделать, прервав запущенный процесс, предлагаю поиграться с программой Screen. Я не использовал Linux какое-то время, но IIRC, просто приостанавливающий команду и возобновляющий ее позже, делает вас довольно уязвимым, если вы случайно выйдете из системы, вы не сможете возобновить сеанс.

Думаю, с помощью экрана можно прервать сеанс, затем отключить его и выйти из системы. Позже вы можете вернуться и повторно подключиться к этому сеансу. Вам придется немного поиграть с этим, но это сделало сеансы намного более надежными.

Вы также можете выйти из системы и вернуться домой, а затем войти удаленно, снова подключиться к системе, которую вы запустили в офисе, и возобновить ее на вечер, а затем снова забрать ее на следующий день на работе.

3
27.01.2020, 19:35

Для этого сценария используйте rsync, забудьте о cp. есть параметры для ограничения пропускной способности, или можно убить/остановить и запустить позже, таким образом, он продолжится с того места, где остановился. пример(ы) rsync для google

8
27.01.2020, 19:35

Если ваша оболочка поддерживает это (почти все поддерживают ), вы можете нажать ^Z (Ctrl+Z ), чтобы легко отправить сигнал SIGTSTPприоритетной задаче, а затем продолжить ее с помощьюfg(на переднем плане )илиbg(на заднем плане ).

Если вы делаете это для нескольких задач и хотите вернуться к ним позже, вы можете использовать команду jobs, а затем вернуться с помощью fg/bg %#, где #— число, указанное в скобках для заданий.

Имейте в виду, что SIGTSTPнемного отличается от SIGSTOP(, который используется во всех других ответах ), в первую очередь из-за того, что его можно игнорировать (, но я не видел программа игнорирует его, кромеsl). Более подробную информацию можно найти в этом ответе на StackOverflow .

0
27.01.2020, 19:35

Вы можете приостановить выполнение процесса, отправив ему сигнал SIGSTOP, а затем возобновить его, отправив сигнал SIGCONT.

Предполагая, что ваша рабочая нагрузка представляет собой один процесс (не разветвляются помощники, работающие в фоновом режиме ), вы можете использовать что-то вроде этого:

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

Затем, когда начнется время занятости, отправьте ему сигнал SIGSTOP:

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

Позже, когда сервер снова будет бездействовать, возобновите его работу.

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

Вам нужно будет запланировать это на определенное время, когда вы хотите, чтобы оно выполнялось, вы можете использовать такие инструменты, как таймеры cron или systemd (или множество других подобных инструментов ), чтобы запланировать это. Вместо планирования на основе временного интервала вы можете выбрать мониторинг сервера (, возможно, просматривая среднюю загрузку, использование ЦП или активность из журналов сервера ), чтобы принять решение о том, когда приостановить/возобновить копирование.

Вам также необходимо управлять PID-файлом (, если вы его используете ), убедитесь, что ваша копия все еще работает, прежде чем приостанавливать ее. готово и т. д.

Другими словами, вам нужно больше, чтобы сделать надежный, но базовая идея использования этих сигналов SIGSTOP и SIGCONT для приостановки/возобновления выполнения процесса, кажется, то, что вы ищете.

80
27.01.2020, 19:35

Вместо того, чтобы приостанавливать процесс, вы также можете присвоить ему более низкий приоритет:

renice 19 "$pid"

присвоит ему самый низкий приоритет, (наивысшую внимательность ), так что этот процесс уступит ЦП другим процессам, которые нуждаются в нем большую часть времени.

В Linux то же самое можно сделать с вводом-выводом с помощьюionice:

ionice -c idle -p "$pid"

Поместит процесс в класс "бездействующих", чтобы он получал дисковое время только тогда, когда никакая другая программа не запрашивала дисковый ввод-вывод в течение определенного льготного периода .

77
27.01.2020, 19:35

Теги

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