Дивіться тут
Є два сигнали, які можуть призупинити виконання процесу. Одна - «витончена», а одна - «силова».
"Витончений" є SIGTSTP
, і його мета - "приємно" попросити процес, якщо він відчуває себе таким, щоб просити призупинити виконання, поки він не отримає SIGCONT
. У випадку з SIGTSTP
цим процес може ігнорувати SIGTSTP і продовжувати виконувати все-таки, тому для цього потрібна співпраця програми, призначеної для обробки SIGTSTP.
"Силовим" є SIGSTOP
, і його мета - призупинити всі потоки простору користувачів, пов'язані з цим процесом. Так само неможливо ігнорувати процес, SIGSTOP
як і його ігнорувати SIGKILL
(остання вбиває процес насильно).
Щоб відправити довільний сигнал, в тому числі і будь-який з них , згаданих тут, ви можете використовувати програми , такі як kill
, killall
або pkill
; або використовувати системний виклик kill(2)
. Перегляньте підказки вашої операційної системи щодо детальної інформації про платформу / архітектуру / версію та помилки стосовно будь-якого з перерахованого вище. Зауважте, що слово "вбити" у всіх цих командах і syscall є поганим помилкою. Ці команди не призначені виключно для завершення процесів. Вони можуть це зробити, надсилаючи певні сигнали; але сигнали можуть також використовуватися для функцій, відмінних від завершення процесу. Наприклад, SIGSTOP
лише призупиняється процес, і це лише один із декількох сигналів, який може бути надісланий таким чином.
Щоб додати умову автоматичного відновлення процесу через певний проміжок часу, вам потрібно буде використовувати якийсь процес моніторингу, який залишається запущеним, і встановлює таймер, щоб прокинути процес моніторингу, який потім по черзі викликає kill(2)
знову і посилає SIGCONT
сигнал до зупиненого процесу, щоб попросити ядро відновити виконання. Зауважте, що у Linux є кілька механізмів синхронізації з різним ступенем точності та точності; Крім того, якщо ваша система дуже зайнята, ваш процес моніторингу може не пробуджуватися, поки не закінчиться її таймер, і, таким чином, пробудження може затриматись.
Якщо ви залежите від дуже точної точності припинення і відновлення призупиненого процесу, можливо , буде потрібно запустити програму моніторингу з правами доступу в режимі реального часу (див цієї сторінки керівництва на sched_setscheduler(2)
інформацію про те , щоб ваш процесі в режимі реального часу). Ви також можете використовувати таймери високої роздільної здатності, функцію ядра Linux (яка доступна лише у тому випадку, якщо ваше обладнання забезпечує їх підтримку), у поєднанні з плануванням у режимі реального часу, щоб отримати дуже точну субмілісекундну точність визначення часу, прокинутися і відправити сигнал для відновлення спостережуваного процесу дуже швидко.
Ви не вказали, які технології ви готові використовувати для цього. Як мінімум, вам буде потрібно щонайменше баш сценаріїв, хоча ви не зможете отримати дуже тонкий графік таким чином. Ось базовий "скрипт" (неперевірений, тому будьте уважні), що є лише доказом концепції вашого запиту. Якщо вам потрібні точні терміни, вам доведеться написати програму, ймовірно, на 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 секунд) він заллє ваш екран базовими даними 64 (випадкові символи від 0-9 та AF). Натисніть Ctrl + C для виходу.