trap blockiert SIGINT nicht für Kindprozess
Von: Hauke Laging (4q2009@hauke-laging.de) [Profil]
Datum: 19.10.2009 05:21
Message-ID: <7k249uF37hjpqU1@mid.uni-berlin.de>
Newsgroup: de.comp.os.unix.shell
Datum: 19.10.2009 05:21
Message-ID: <7k249uF37hjpqU1@mid.uni-berlin.de>
Newsgroup: de.comp.os.unix.shell
Moin, (nicht nur) mich regt seit langem auf, dass less für Aktionen der Art bash -vx programm 2>&1 | less unbrauchbar ist, wenn das Programm etwas länger läuft. Kaum kommt man mal ans "Dateiende", blockiert less, bis das Programm wieder das ausgibt (was lange dauern kann). Diese Blockade kann man zwar mit ^C lösen, aber - haha - das hat ja gewisse Nebeneffekte, wenn less das Ende einer Pipeline ist. Also habe ich mir gedacht, muss ich nur dafür sorgen, dass der Rest der Pipeline SIGINT ignoriert; schon kann ich less ordentlich bedienen. Der gescheiterte Versuch sieht so aus: (trap "" SIGINT;./backup_user.diff.sh 2>&1) | less In der man page steht: Trapped signals that are not being ignored are reset to their original values in a child process when it is created. Das kann man doch nur so verstehen, dass die ignorierten auch weiter ignoriert werden. Werden sie aber nicht. Wenn ich allerdings kein externes Programm starte, sondern eine Ausgabe mit einer for-Schleife erzeuge, dann funktioniert es wie erwartet (allerdings weiß ich jetzt nicht, ob das "sleep 1" von dem ^C vorzeitig beendet wurde...) Kluge Alternativvorschläge? Mein noch nicht getesteter Plan B sieht so aus, dass ich etwas Shellcode zwischen das fragliche Programm und less hänge, der nach einer Sekunde eine Leerzeile ausgibt, wenn über die Pipe nichts kommt. Mit zsh sollte das gehen, die kennt auch non-blocking reads. Und less könnte dann mittels --squeeze-blank-lines die meisten Leerzeilen ausblenden. CU Hauke -- http://www.hauke-laging.de/ideen/[ Auf dieses Posting antworten ]
Antworten
- Marcel Bruinsma (20.10.2009 20:50)
- Hauke Laging (20.10.2009 23:13)
