Offene File Handles nach kopieren mit phpseclib3

1 view
Skip to first unread message

Jan Novak

unread,
Aug 17, 2021, 2:52:32 AMAug 17
to
Hallo,

ein primärer php (cli) Prozess forkt immer wieder neu einen Prozess,
welcher Dateien u.a. mit der "phpseclib3" Klasse von Server a nach b
kopiert. Leider bleibt nach dem Kopieren immer ein File Handle offen,
was nach gewisser Zeit Probleme natürlich macht, obwohl der ge'forkte
Prozess sich sauber beendet hat.

Die einzige Möglichkeit dies zu verhindern, bzw. zu resetten ist im
Moment, den primären CLI Prozess neu zu starten, was aber in unserem
Fall andere Nachteile mit sich zieht.

Meine Frage:
Gibt es ein Möglichkeit, die offenen Handles korrekt schliessen zu lassen?

zur Info: Sofern die Dateien mit anderen Klassen z.B. per ftp oder nur
lokal kopiert werden, besteht das Problem nicht. Nur dann, wenn die
phpseclib3 benutzt wird.

Jan

Karl Pflästerer

unread,
Aug 19, 2021, 6:50:56 AMAug 19
to
Ohne dass du beschreibst, was du warum machst, kann dir niemand helfen.

Bei deiner Beschreibung nehme ich mal an, dass die Prozesse auf
Linux/BSD (oder etwas anderem unixoiden) laufen.

Erste Frage: warum nimmst du phpseclib, wenn die Lib bei dir Fehler
produziert?
Wie kopierst du?
Hast du Nutzername/Passwort oder private/public key zur Authentisierung?
Im letzeren Fall: nimm rsync.

Warum nutzt du einen eigenen Daemon? Ein Cron Job, der dein Skript
peridisch startet ist deutlich simpler.
Wie forkst du genau?
etc pp.


KP

Arno Welzel

unread,
Aug 20, 2021, 3:45:10 AMAug 20
to
Jan Novak:

> Hallo,
>
> ein primärer php (cli) Prozess forkt immer wieder neu einen Prozess,
> welcher Dateien u.a. mit der "phpseclib3" Klasse von Server a nach b
> kopiert. Leider bleibt nach dem Kopieren immer ein File Handle offen,
> was nach gewisser Zeit Probleme natürlich macht, obwohl der ge'forkte
> Prozess sich sauber beendet hat.
>
> Die einzige Möglichkeit dies zu verhindern, bzw. zu resetten ist im
> Moment, den primären CLI Prozess neu zu starten, was aber in unserem
> Fall andere Nachteile mit sich zieht.
>
> Meine Frage:
> Gibt es ein Möglichkeit, die offenen Handles korrekt schliessen zu lassen?

Ja, indem der Prozess, der sie öffnet, das korrekt tut. Einen anderen
Weg gibt es nicht.

> zur Info: Sofern die Dateien mit anderen Klassen z.B. per ftp oder nur
> lokal kopiert werden, besteht das Problem nicht. Nur dann, wenn die
> phpseclib3 benutzt wird.

Dann nutze phpseclib3 nicht oder frage dort, warum die Handles nicht
sauber schließen und/oder ihre forks nicht sauber abschließen. Nein,
einen geforkten Prozess einfach nur zu beenden, reicht nicht. Der
Aufrufer, der den Fork erstellt hat, muss auch auf dessen Beendigung
reagieren, sonst passieren u.A. genau solche Probleme.


--
Arno Welzel
https://arnowelzel.de

Arno Welzel

unread,
Aug 20, 2021, 3:47:23 AMAug 20
to
Arno Welzel:
Ergänzung dazu: aus einem Projekt, wo ich mit sowas zu tun hatte:


protected function signalHandler($signal)
{
if (SIGCHLD === $signal) {
// Clean up child processes

$pid = pcntl_waitpid(-1, $status, WNOHANG);
while ($pid > 0) {
$exitCode = pcntl_wexitstatus($status);
$pid = pcntl_waitpid(-1, $status, WNOHANG);
}
} else {
$this->run = false;
}
}

...

if (function_exists('pcntl_signal')) {
pcntl_signal(SIGTERM, [$this, 'signalHandler']);
pcntl_signal(SIGHUP, [$this, 'signalHandler']);
pcntl_signal(SIGINT, [$this, 'signalHandler']);
pcntl_signal(SIGCHLD, [$this, 'signalHandler']);

Jan Novak

unread,
Aug 20, 2021, 9:33:35 AMAug 20
to
Am 20.08.21 um 09:45 schrieb Arno Welzel:
>> ein primärer php (cli) Prozess forkt immer wieder neu einen Prozess,
>> welcher Dateien u.a. mit der "phpseclib3" Klasse von Server a nach b
>> kopiert. Leider bleibt nach dem Kopieren immer ein File Handle offen,
>> was nach gewisser Zeit Probleme natürlich macht, obwohl der ge'forkte
>> Prozess sich sauber beendet hat.
>>
>> Die einzige Möglichkeit dies zu verhindern, bzw. zu resetten ist im
>> Moment, den primären CLI Prozess neu zu starten, was aber in unserem
>> Fall andere Nachteile mit sich zieht.
>>
>> Meine Frage:
>> Gibt es ein Möglichkeit, die offenen Handles korrekt schliessen zu lassen?
>
> Ja, indem der Prozess, der sie öffnet, das korrekt tut. Einen anderen
> Weg gibt es nicht.

das habe ich befürchtet ...


>> zur Info: Sofern die Dateien mit anderen Klassen z.B. per ftp oder nur
>> lokal kopiert werden, besteht das Problem nicht. Nur dann, wenn die
>> phpseclib3 benutzt wird.
>
> Dann nutze phpseclib3 nicht oder frage dort, warum die Handles nicht
> sauber schließen und/oder ihre forks nicht sauber abschließen.

Das war ebenso zu befürchten.
OK, dann muss ich damit zunächst leben und anderweitig reagieren. Deine
2. Mail mit dem Codebeispiel ist sehr interessant. Vor allem mit dem
pcntl_waitpid und pcntl_signal war mir gar nicht bekannt.


Jan
Reply all
Reply to author
Forward
0 new messages