Powiedzmy, że mam skrypt bash o nazwie log.sh
. W tym skrypcie chcę odczytać dane wejściowe z potoku, ale chcę również poznać polecenie użyte do przesłania danych wejściowych do mnie. Przykład:
tail -f /var/log/httpd/error | log.sh
W skrypcie powłoki chcę znać polecenie tail -f /var/log/httpd/error
.
Odpowiedzi:
Akira zasugerował użycie
lsof
.Oto jak możesz to napisać:
whatpipe2.sh
Uruchamianie:
Innym sposobem jest użycie grup procesów.
whatpipe1.sh
Uruchamianie:
Zauważ, że oba działają tylko wtedy, gdy polecenie po lewej stronie potoku działa wystarczająco długo,
ps
aby je zobaczyć. Powiedziałeś, że go używasztail -f
, więc wątpię, żeby to był problem.źródło
potok pojawi się jako wpis na liście otwartych deskryptorów plików twojego procesu:
możesz także użyć czegoś takiego:
więc, niż masz i-węzeł potoku :) możesz teraz przeszukiwać każdy inny proces
/proc/
dla tego potoku. wtedy będziesz miał polecenie, które do ciebie dołącza:w tym przykładzie
cat
poprowadzono do totemówsh
. w/proc/29889
możesz znaleźć plik o nazwie,cmdline
który mówi ci, co dokładnie nazywało się:pola wiersza poleceń są oddzielone przez NUL, więc wygląda trochę brzydko :)
źródło
Oto kompaktowe rozwiązanie wykorzystujące nowoczesne i
lsof
nowoczesne dystrybucje Linuksa:Zawiera listę plików końcowych (
+E
) FD 0 w bieżącym procesie powłoki (-p $$ -a -d 0
), a następnie ogranicza dane wyjściowe tylko do PID (-t
), uzyskując PID po obu stronach potoku.Uwaga:
{ echo Hi; sleep 5 ; } | whatpipe.sh
Prawdopodobnie dabash
(wejściową podpowłokę) isleep 5
.+E
jest dostępny tylko, jeślilsof
został skompilowany z-DHASUXSOCKEPT
. To powinno być prawdą w przypadku większości współczesnych dystrybucji Linuksa, ale mimo to sprawdź swoją instalację za pomocą:lsof -v 2>&1 | grep HASUXSOCKEPT
źródło