2013-06-25 4 views
2

Если программа PROG вызывается с трубами,Другие программы в трубе

progA | progB | PROG | progC ... 

Есть ли способ для того, чтобы сказать, в каком контексте она была вызвана - то есть, от/к чему другие программы (A, B , C ...) он принимает или отправляет выходные данные по каналам?

Меня интересует ближайший предшественник до PROG (в приведенном выше примере, progB), но мне также интересен более общий вопрос.

+0

Это можно сделать, да, но не легко и (как говорит l0b0) не переносимо. – Kevin

+0

Какова большая или основная проблема, так что это то, что вам кажется нужным? –

+0

@CharlesDuffy: 'PROG' немного похож на [grcat/grc] (http://kassiopeia.juls.savba.sk/~garabik/software/grc/README.txt) и идеально« раскрашивает »(не на самом деле что он делает, но не _relevantly_ different), основанный на том, что он знает о предыдущих программах, а не о расширениях файлов. – user2141650

ответ

2

Если вы работаете в Linux, вы можете использовать /proc filesystem, чтобы проверить, как команды обмениваются данными по трубам. Однако это не очень портативно.

+0

Я подожду, чтобы увидеть, появились ли какие-либо портативные решения, но в противном случае ваш сценарий оболочки был очень полезен. Похоже, что это не сработает, если предыдущая программа вышла. К сожалению, если вы подключите программу к другому, например, ошибка шины, вы получите сообщение об ошибке, которое отображает все элементы канала, независимо от того, выходят ли они. Если бы только ядро ​​могло выявить то, что, очевидно, знает ... – user2141650

+0

Спасибо за подсказку. Я также очень хочу знать ответ на ваш вопрос, чтобы продолжить разработку скрипта. – l0b0

2

Вы можете использовать ps, чтобы показать все процессы, имеющие один и тот же родительский элемент. Например, если PROG имеет PID PID, на Linux вы можете сделать:

ps --ppid $(ps -o ppid= $PID) 

, чтобы получить список всех команд в конвейере. (На самом деле, вы получите все команды, которые являются дочерними элементами оболочки, которые вызывают конвейер, что может быть достаточным. Вы можете проверить группу процессов каждого, чтобы определить, какие из них действительно находятся в конвейере.) Порядок, в котором они печать не обязательно является порядком, который они отображаются в трубе, поместите вы можете посмотреть в /proc/pid/fd, чтобы просмотреть индексный дескриптор входных данных каждого процесса, чтобы определить, как они выстраиваются в линию.

Смежные вопросы