Они на самом деле показывают ту же информацию по-разному. Это что -f
и -L
опции к ps
сделайте (от man ps
, шахта акцента):
- f Делают список полных форматов. Эта опция может быть объединена со многими другими параметрами стиля UNIX для добавления дополнительных столбцов. Это также заставляет аргументы команды быть распечатанными. При использовании с-L, NLWP (количество потоков) и LWP (идентификатор потока), столбцы будут добавлены.
- L Выставочные потоки, возможно со столбцами LWP и NLWP.
tid TID уникальное число, представляющее dispatacable объект (искажают lwp, spid). Это значение может также появиться как: идентификатор процесса (pid); идентификатор группы процесса (pgrp); идентификатор сессии для лидера сессии (sid); идентификатор группы потока для лидера группы потока (tgid); и tty обрабатывает идентификатор группы для лидера группы процесса (tpgid).
Так, ps
покажет идентификаторы потока в LWP
столбец, в то время как PID
столбец является фактическим идентификатором процесса.
top
с другой стороны, перечисляет различные потоки в PID
столбец, хотя я не могу найти явное упоминание об этом в man top
.
Процесс Bash, который продолжает работать, является родителем TEE
, а не оригинальный скрипт. Вы можете видеть, что, добавив следы, которые отображают идентификаторы процесса:
#!/bin/bash
echo original=$$
exec > >(echo substitution=$BASHPID; tee /tmp/mylog.log) 2>&1
bash -c 'echo sleeper=$$; sleep 12312' &
Это делает появление дополнительного процесса Bash, родитель сон
. Чтобы избавиться от этих процессов Bash, используйте Exec
по всему:
#!/bin/bash
echo original=$$
exec > >(echo substitution=$BASHPID; exec tee /tmp/mylog.log) 2>&1
bash -c 'echo sleeper=$$; exec sleep 12312' &
Я проверил этот ответ на Bash 4.3. Будущие версии Bash могут стать умнее не хвостовыми звонками (вроде KSH).