Как узнать, запущен ли процесс в фоновом или приоритетном режиме в командах ps
или ps -ef
?
Сначала я подумал, что когда я ввожу ps -ef
, есть раздел с названием TTY. Когда я смотрю на список TTY, большинство из них ?
. Интересно, означает ли этот вопросительный знак процесс, работающий в фоновом режиме.
Я хочу проверить, прав ли я! Если нет, то как узнать, запущен ли процесс в фоновом режиме или на переднем плане?
ps. команда jobs
здесь не используется.
решение1
Полеstat
имеет дополнение +
для процессов переднего плана:
ps -e -o pid,tty,stat,cmd
Процессы переднего плана — это те, чей идентификатор группы процессов ( pgid
) является идентификатором переднего плана на терминале ( tpgid
):
ps -e -o pid,pgid,tpgid,tty,cmd | awk '$2==$3'
Когда я смотрю на список TTY, большинство из них — это «?» (вопросительные знаки). Интересно, означает ли этот вопросительный знак, что процесс выполняется в фоновом режиме?
Нет, это означает, что у них нет управляющего tty (демонов или потоков ядра, ни переднего плана, ни заднего плана). Для спискафонпроцессы:
ps -e -o pid,pgid,tpgid,tty,cmd | awk '$3!=-1 && $2!=$3'
решение2
Автор вопроса спросил: «... как узнать, запущен ли процесс в фоновом режиме или на переднем плане?»
Статус переднего плана и фонапроцесссообщаются ps
каксостояниепроцесса. man ps
перечисляет этипроцессы состоянияпод заголовком PROCESS STATE CODE
.
ps -ef
не сообщает о состоянии процесса, но ссылаясь на раздел man ps
, мы находим OUTPUT FORMAT CONTROL
, что -o
аргумент может использоваться для указания вывода ps
через один или несколькоключевые слова. Этиключевые словаперечислены в STANDARD FORMAT SPECIFIERS
разделе, и с необычайной настойчивостью в конечном итоге можно найти ключевые слова s
, stat
и state
перечисленные. Но обратите внимание, что хотя все три из нихключевые словабудет предоставлятьсостояниена выходе толькоstat
ключевое словодаст multi-character process state
! Вывод:ps
благоприятствует добросовестному пользователю.
В качестве примера следующая ps
команда выведетПИД,состояние, икомандакоторый начал процесс с использованиемключевые слова pid
, stat
и command
:
ps -eo pid,stat,command
Чтобы увидеть, как это работает, рассмотрим следующий пример:
В одном терминале выполните следующую команду:
ping 8.8.8.8 > /dev/null
В другом терминале:
ps -eo pid,stat,command | grep ping | grep -v grep
12518 S+ ping 8.8.8.8
Что сообщает нам:
- PID-это
12518
- процесссостояниеесть
S+
(через ключевое словоstat
) - что
command
породило этот процесс, былоping 8.8.8.8
Требуется еще один шаг, чтобы узнать, является ли этот процесс передним или задним планом:состояниезначение S+
должно бытьраскодированопод man ps
заголовком PROCESS STATE CODE
- который говорит нам:
S прерываемый сон (ожидание завершения события)
+ находится в группе процессов переднего плана
Следовательно, мы видим из +
позиции второго символа, что этот процесс выполняется впередний план. Фоновый процесс может быть указан с S
первой позицией символа и без него во второй позиции. Существует несколько других комбинаций символов, которые указывают на фоновый процесс; см.этотдля листинга.
Кстати:Это работает в моей системе на базе Debian (указана версия ps from procps-ng 3.3.15
), а также в macOS 10.15 (которая произошла от версии BSD ps
).