Wenn bash
ich in ausführe:
cmd1 | cmd2 | ... | cmdi | ... | cmdn &
Wo cmd{1..n}
kann das die PID von nicht unterscheiden cmdi
? Wie kann ich alternativ den cmdi
Prozess signalisieren ? (Zum Beispiel ist es senden SIGUSR1
?)
pkill
/ pgrep
, pidof
Usw. sieht nicht aus wie gute Antworten, da andere Instanzen cmdi
vielleicht läuft, unter anderem als Teil der gleichen Pipeline. jobs -p
gibt die PID von cmd1
für mich.
i
kann alles sein in {1..n}
.
bash
shell
pipe
job-control
muru
quelle
quelle
cat /var/run/out | nc -l 8080
ist nur oberflächlich ähnlich zucmd1 | cmd2
? Ihre Einschränkung, dass Sie die Bare-Bones-Pipeline eingeben und dann die PIDs wiederherstellen möchten, ist (1) in der Frage nicht angegeben und (2) es ist unwahrscheinlich, dass eine gute, allgemeine Lösung möglich ist.cmd1 | cmd2
ist ein ganz besonderer Fall, in dem beide PIDs leicht erhältlich sind. Habe ich etwas über n gesagt? Warum würden Sie also n = 2 annehmen? Habe ich etwas darüber gesagt, was cmdi ist? Warum sollten Sie also annehmen, dass ich cmdi ändern könnte? Ich bitte um eine allgemeine Lösung und Sie legen Beschränkungen auf.Antworten:
Für die ursprüngliche Version der Frage ist die spezielle Variable
$!
perfekt , wenn nur die PID des letzten Befehls gewünscht wurde .Es gibt keinen ähnlich einfachen Zugriff auf die PIDs der anderen Prozesse.
Es hat lange gedauert, bis
$pipestatus
(zsh) und$PIPESTATUS
(bash) hinzugefügt wurden, sodass wir endlich Zugriff auf alle Exit-Status in einer Pipeline haben, zusätzlich zu$?
dem letzten, der seit der ursprünglichen Bourne-Shell verfügbar war. Vielleicht passiert$!
irgendwann etwas Analoges .quelle
Ich denke, Sie könnten etwas tun, wie hier vorgeschlagen .
Hier im obigen Beispiel habe ich die PID des dritten Pipeline-Prozesses abgerufen und bis zur Datei-PID notiert. Ich konnte es für jeden Rohrleitungsprozess notieren.
quelle
jobs -p
. signalisiere es mitSIGPIPE
. Willst ducmdi
- das.Eine nicht sehr portable, Linux-spezifische Lösung könnte darin bestehen, die Prozesse mithilfe der Pipes zu verfolgen, die sie verbinden. Wir können die PIDs der Befehle first (
jobs -p
) und last ($!
) in der Pipeline abrufen . Mit beiden PIDs könnte dieses Skript folgende Aufgabe übernehmen:quelle
Ich verwende hier in diesem Code nullbasierte Arrays. Sei einfach vorsichtig, woran du vorbeigehst
eval
.quelle