Prozess verhindert Telnet-Login?

laland

Neuer User
Mitglied seit
9 Feb 2008
Beiträge
40
Punkte für Reaktionen
0
Punkte
0
Hallo Community!

Ich lasse auf meiner Fritzbox einige Prozesse laufen, wie zb. einen selbstkompilierten psybnc und auch ein Programm, das ich selbst geschrieben habe. Durch einen Zufall habe ich nun etwas sehr merkwürdiges entdeckt:

Wenn ich die Prozesse, die sich in beiden Fällen mit fork(2) in den Hintergrund befördern, auf dem ersten 'pseudo Terminal' (pts0) funktioniert das auch vollkommen problemlos. Wenn ich dort allerdings schon einen Hintergrund-Prozess gestartet habe und bei späteren Logins deswegen ein anderes Terminal bekomme (pts1, pts2, ...) und diese dann wieder mit einem Hintergrundprozess "belege", komme ich bei weiteren Logins nichtmehr rein. Putty & telnet stellen zwar noch eine Verbindung her aber der einzige Weg, um sich wieder einloggen zu können ist ein reboot der Fritzbox über das Webinterface.


Ist dieses Problem bekannt? Gibt es eine Lösung?



L
 
Hast Du dieses Problem erst, nachdem Du alle PTYs belegt hast? Die Anzahl der PTYs ist begrenzt, daher ist es keine gute Idee, diese offen zu lassen.
 
Definiere 'geöffnet'; ich schliesse die PTS' meist mit CTRL+d, aber beim darauffolgenden Login ist die pts-nummer höher, darum gehe ich davon aus, dass selbst wenn das PTS geschlossen wurde ein Hintergrundprozess dort etwas reserviert. (Ich hatte trotzdem aber nur 2 offene PTS')
 
Mit geöffnet meine ich in Verwendung, aber das bringt uns auch nicht weiter.

Mit CTRL+d kannst Du nicht ein PTY schließen, sondern die Shell beenden. Wenn sonst kein Prozeß das PTY offen hat, dann sollte es damit wieder frei sein und beim nächsten Login wieder die gleiche Nummer vergeben werden.

Wenn ein Prozeß im Hintergrund weiter läuft und das PTY geöffnet hat, dann ist das PTY weiterhin belegt. Und wenn alle belegt sind, gibt es irgendwann kein freies mehr, um eine neue Session anzufangen.

Was Du möglicherweise möchtest, ist folgendes:
Code:
# Statt
programm &
# nimmst Du
programm < /dev/null > /dev/null 2>&1 &
Damit werden die standard Dateien mit /dev/null verbunden und somit nicht mehr mit dem PTY.
Die meisten Server-Programme tun das von selbst, das von Dir verwendete Programm gehört anscheinend nicht dazu.

Probiere das mal aus und sag Bescheid, ob es hilft.
 
Funktioniert. Danke für Deine Hilfe!

Auf die gefahr hin, dass es zu sehr Off-Topic ist, aber da du schon gesagt hast, dass einige Programme das von sich aus machen, muss ich einfach fragen:

Mit welchen Systemcalls/Subroutines kank ich die std-filenos stdout & stderr umbiegen, so wie es die Shell in der Commandline macht?



L
 
Geht es um ein eigenes Server-Programm, das Du schreiben willst?
Ein guter Einstig ist, sich andere, vorhandene Server-Programme anzuschauen.

Aber prinzipiell kannst Du folgendes machen (ungetestet):
Code:
// Prozeß in den Hintergrund bringen
switch (fork ()) {
case -1: // Fehler bei fork()
  perror ("fork");
  exit (1);
case 0:  // Child
  break;
default:  // Parent
  exit (0);
}
// Deskriptoren mit /dev/null verbinden
int fd = open ("/dev/null", O_RDWR);
// ggf. Prüfen, ob erfolgreich, sollte bei /dev/null der Fall sein.
// fd auf Deskriptoren 0, 1 und 2 kopieren
dup2 (fd, 0);
dup2 (fd, 1);
dup2 (fd, 2);
// fd schließen, falls größer 2, ist normalerweise der Fall
if (fd > 2)
  close (fd);
// Neue Session, Prozeß von controlling tty abtrennen
setsid ();
Der erste Teil erstellt automatisch einen Hintergrund-Prozeß, so daß das Programm nicht mit & gestartet werden muß. Idealerweise macht man das erst nach der Initialisierung, damit man vorher Rückmeldungen an das aufrufende Programm geben kann.
Der zweite Teil verbindet die Deskriptoren 0 bis 2 mit /dev/null und schließt somit die vorher eventuell bestehenden Verbindungen zu anderen Dateien. fd hat einen Wert größer als 2 (normalerweise 3), wenn nicht einer der niedrigeren Deskriptoren vorher frei war. Dies ist beim Start über eine Shell normalerweise nicht der Fall.
Mit setsid wird der Prozeß aus der Session der Shell herausgenommen, das kann zumindest nicht schaden.

PS:
nicht nur stdout & stderr, sindern auch stdin
 
Kostenlos!

Statistik des Forums

Themen
248,923
Beiträge
2,305,217
Mitglieder
378,647
Neuestes Mitglied
nightdeck