Как я препятствую тому, чтобы должностное лицо поддерживало сценарий в рабочем состоянии?

Они на самом деле показывают ту же информацию по-разному. Это что -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.

3
20.04.2015, 23:20
1 ответ

Процесс 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).

3
27.01.2020, 21:23

Теги

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