Ich habe ein einfaches Wrapper-Skript geschrieben, um Befehle zu wiederholen, wenn sie fehlschlagen: retry.py. Da ich jedoch die Ausgabe des Kinderbefehls sehen möchte, musste ich ein paar Tricks machen. Dies funktioniert in Ordnung für Programme wie rsync, aber andere wie scp wenden einen zusätzlichen Test an, um Dinge wie ihre Fortschrittsanzeige anzuzeigen.Wie lege ich die Terminal-Vordergrund-Prozessgruppe für einen Prozess fest, den ich unter einem Pty laufen lasse?
Der scp-Code hat einen Test, der im Großen und Ganzen ist:
getpgrp() == tcgetpgrp(STDOUT_FILENO);
, die, wenn ich aber das Wrapper-Skript ausführen fehlschlägt. Wie können Sie mit meiner einfachen tty_test.c Testfall sehen:
./tty_tests
isatty reports 1
pgrps are 13619 and 13619
und:
./retry.py -v -- ./tty_tests
command is ['./tty_tests']
isatty reports 1
pgrps are 13614 and -1
child finished: rc = 0
Ran command 1 times
Ich habe versucht, die tcsetpgrp() verwendet, die auf den pty fd die als IOCTL endet aber, dass ergibt ein -EINVAL für ptys. Ich würde es vorziehen, die Python-Subprozess-Maschinerie weiter zu verwenden, wenn es überhaupt möglich ist, oder wird manuell fork/execve'ing dafür erforderlich sein?
Ich habe es versucht und es hat keine Wirkung: > retry.py -v - ~/mysrc/retry.git/tty_tests Befehl ist ['/home/ajb/mysrc/retry.git/tty_tests] isatty reports 1 pgrps sind 28268 und -1 Kind fertig: rc = 0 Ran Befehl 1 mal – stsquad
Könnten Sie etwas vollständigen Code einfügen? –
OH! Ich habe gerade festgestellt, dass Sie in Ihrer Frage einen Link zu retry.py angegeben haben. Ich dachte, das wäre nur Stackoverflow, der versucht, hilfreich zu sein und aus etwas herauszukommen, das wie ein Hostname aussieht. Ich werde es mir ansehen. –