Jeśli bash
wykonam:
cmd1 | cmd2 | ... | cmdi | ... | cmdn &
gdzie cmd{1..n}
mogą nie być wyraźne, w jaki sposób uzyskać PID cmdi
? Alternatywnie, jak mogę zasygnalizować cmdi
proces? (Na przykład, wysłać go SIGUSR1
?)
pkill
/ pgrep
, pidof
Itd. Nie wygląda dobrych odpowiedzi, od innych instancji cmdi
może działa, w tym w ramach tego samego rurociągu. jobs -p
podaje PID cmd1
dla mnie.
i
może być cokolwiek {1..n}
.
bash
shell
pipe
job-control
muru
źródło
źródło
cat /var/run/out | nc -l 8080
jest tylko pozornie podobny docmd1 | cmd2
? Twoje ograniczenie, że chcesz wpisać rurociąg z gołą kością, a następnie odzyskać PID, jest (1) nie wymienione w pytaniu i (2) jest mało prawdopodobne, aby pozwolić na dobre, ogólne rozwiązanie.cmd1 | cmd2
jest bardzo szczególnym przypadkiem, w którym oba PID są łatwo dostępne. Czy mówiłem coś o n? Dlaczego więc miałbyś założyć n = 2? Czy mówiłem coś o tym, czym jest cmdi? Dlaczego więc miałbyś zakładać, że mogę zmodyfikować cmdi? Proszę o ogólne rozwiązanie, a pan nakłada ograniczenia.Odpowiedzi:
W oryginalnej wersji pytania, gdy pożądany był tylko PID ostatniego polecenia, specjalna zmienna
$!
jest idealna.Nie ma podobnego łatwego dostępu do PID innych procesów.
Dodanie
$pipestatus
(zsh) i$PIPESTATUS
(bash) zajęło dużo czasu , dając w końcu dostęp do wszystkich statusów wyjściowych w potoku, oprócz$?
ostatniego, który istniał od czasu oryginalnej powłoki Bourne'a. Może w$!
końcu wydarzy się coś analogicznego .źródło
Myślę, że możesz zrobić coś, co sugerowano tutaj .
Tutaj w powyższym przykładzie pobrałem pid trzeciego procesu potokowego i zanotowałem go do pliku pid. Mogłabym to zanotować dla każdego procesu potokowego.
źródło
jobs -p
. zasygnalizuj to za pomocąSIGPIPE
. Czy chceszcmdi
- to.Niezbyt przenośnym rozwiązaniem specyficznym dla systemu Linux może być śledzenie procesów za pomocą łączących je potoków. Możemy uzyskać PID pierwszego (
jobs -p
) i ostatniego ($!
) polecenia w potoku. Używając PID, ten skrypt może wykonać zadanie:źródło
W tym kodzie używam tablic zerowych. Uważaj tylko, przez co biegniesz
eval
.źródło