Допустим, у меня есть скрипт bash log.sh
. В этом сценарии я хочу прочитать входные данные из канала, но я также хочу знать команду, используемую для передачи входных данных в меня. Пример:
tail -f /var/log/httpd/error | log.sh
В сценарии оболочки я хочу знать команду tail -f /var/log/httpd/error
.
Ответы:
Акира предложил использовать
lsof
.Вот как вы можете написать это:
whatpipe2.sh
Запуск это:
Другой способ - использование групп процессов.
whatpipe1.sh
Запуск это:
Обратите внимание, что они оба работают, только если команда на левой стороне канала выполняется достаточно долго,
ps
чтобы увидеть ее. Вы сказали, что используете егоtail -f
, поэтому я сомневаюсь, что это проблема.источник
канал будет отображаться как запись в списке открытых файловых дескрипторов вашего процесса:
Вы также можете использовать что-то вроде:
так, чем у вас есть инод канала :), теперь вы можете искать любой другой процесс под
/proc/
этим каналом. тогда у вас будет команда, которая передает вам:в этом примере по
cat
трубопроводуsh
. внутри/proc/29889
вы можете найти файл с именем,cmdline
который говорит вам, что именно было названо:поля командной строки разделены NUL, поэтому выглядит немного некрасиво :)
источник
Вот компактное решение с использованием современных
lsof
на современных дистрибутивах Linux:Это перечисляет файлы конечной точки (
+E
) FD 0 в текущем процессе оболочки (-p $$ -a -d 0
), затем ограничивает вывод только PID (-t
), получая PID с обеих сторон канала.Обратите внимание, что:
{ echo Hi; sleep 5 ; } | whatpipe.sh
, вероятно, приведет кbash
(входной подоболочке) иsleep 5
.+E
доступен только еслиlsof
был скомпилирован с-DHASUXSOCKEPT
. Это должно быть верно для большинства современных дистрибутивов Linux, но все равно проверьте вашу установку:lsof -v 2>&1 | grep HASUXSOCKEPT
источник