[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2004
    Beiträge
    360

    QSH Probleme zu viele offene Files / Deskriptor ungültig

    Moin Zusammen,
    ich habe folgendes Problem und schon das ganze WE damit verbracht.
    Beim Aufruf > 200 bricht das Programm mit folgendem Fehler ab:
    Deskriptor ungültig.

    Zu viele offene Dateien für diesen Prozess.
    Es geht um ein Programm, welches FTP, SFTP und FTPS durchführt, alles über die QSH Umgebung, mittels Curl oder OPENSSH.

    Der Fehler kommt hier hoch:
    fd = open(%trim(dsSIQSH.Stdin):O_RDONLY);
    if fd = -1;
    pErrno = getErrnoPtr();
    displayError = %str(strerror(errno));
    dsply (displayError);
    endif;

    Weiter unten wird ein
    fd = close(fd);
    gemacht. Da kommt das Programm auch immer hin. Das Problem ist, dass dies ganz woanders passieren kann.

    Die Anwendung besteht aus vielen Serviceprogrammen, dies noch zur Info.


    Da das Programm extrem kritisch ist und laufen muss habe ich versucht den Wert von 200 auf 10000 zu erhöhen, leider greift das nicht, weil dies immer nur in der jeweiligen QSH Session passiert. Man kann es permanent wohl nur über ein C Programm durchführen.
    Aufruf im CL Programm:
    QSH CMD('ulimit -S -n 10000')
    Danch wird der command aufgerufen, der die FTP Übertragung startet.
    ulimit wird zwar ausgeführt, gilt aber nur in dieser QSH Umgebung, somit kann ich es nicht nutzen, weil im Programm selbst die QSH Umgebung so geöffnet wird:
    QShell like(tSIQSH);
    dsSICURL.QShell = QShell;

    Irgendwo muss etwas nicht sauber geschlossen werden, finde es aber aktuell nicht, da das Programm fremd geschrieben ist. Die Sourcen liegen vor.
    Seht Ihr noch eine Möglichkeit diese Problem erst mal in einem Workarround zu umgehen, bis ich die Stelle gefunden habe. Vlt. wird auch alles sauber geschlossen und es handelt sich um eine ganz anderes Problem.
    Ich habe auch nichts gefunden die offenen Files/Zugriffe der QSH Umgebung wieder zurückzusetzen, außer dass der Job beendet werden muss.
    Ein RCLRSC hat nicht geholfen, auch nicht RCLRSC *Caller.

    Auch wichtig wäre, wie man überhaupt sehen kann wie der Counter hoch geht.


    Vielen Dank schon mal.

    Gruß Klaus

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    "Irgendwo muss etwas nicht sauber geschlossen werden, finde es aber aktuell nicht"
    Da gibts leider keinen Workaround.
    Was macht das Script ansosnten noch?
    Ggf. kannst du das "partitionieren", also u.U. in Häppchen zu max. 100 Dateien?

    Ggf. kannst du auch einen Zwangsclose machen:
    https://www.ibm.com/docs/en/i/7.5.0?topic=commands-exec
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Nov 2020
    Beiträge
    418
    Wo genau gibt es welche Fehlermeldung?
    Der Open wird ja im RPG gemacht und nicht in der QSH, wenn ich es richtig verstanden habe.

    Du kannst aber in der QSH Befehle verketten:
    Z.B.: QSH CMD('ulimit -S -n 10000; echo cmd2; echo cmd3')

    Ich würde auch mal den STRAUTCOL Befehl checken. Eventuell kannst du hier erkennen ob die entsprechenden CLOSE Prozeduren aufgerufen werden. Die Chance ist zwar eher gering, aber wenn du Glück hast, werden sie hier aufgelistet. Dann könntest du das besser prüfen.
    Ansonsten würde ich einfach eine Logausgabe für jeden Open und Close machen.
    Dann siehst du auch wo immer ein Open/Close gemacht wird.

    lg Andreas

  4. #4
    Registriert seit
    Sep 2004
    Beiträge
    360
    Danke Euch, ich habe nun mitdem C Programm direkt am Anfang des Programmes für den FTP Prozess den Wert von ulimit auf 10000 gesetzt. Damit kommen wir aktuell jeden Tag über die Runden, da der Job am Abend beendet wird. Aber schon wenig, dass der default Wert auf 200 sitzt. In der Pase Umgebung sind es immerhin 2000.
    Genau der Open und close wird im RPG gemacht in unterschiedlichen Service Programmen, ein Beispiel auch hierzu:

    //----------------------------------------------------------
    // Routine doSFTP
    //----------------------------------------------------------
    begsr doSFTP;

    sFTP = SISFTP_new(QShell:Credentials:Srv:Server.port);
    SISFTP_runCmd(sFTP:%trim(cmd));


    QShellLog = SISFTP_getQShellLog(sFTP);
    QShellLogId = SISFTP_getId(sFTP);
    QshLogEntrys = SIQSHLOG_listById(QShellLog:QShellLogId);

    SISFTP_close(sFTP);

    endsr;

    Die Idee mit dem Open / Close werde ich wohl machen müssen, sonst wird es extrem komplex.
    Was bewirkt der STRAUTCOL? Habe gelesen, dass es hier um Berechtigungen geht, wie soll sich das auf einen fehlenden Close auswirken und wo wird das hin protokolliert?

    Gruß Klaus

  5. #5
    Registriert seit
    Nov 2020
    Beiträge
    418
    @STRAUTCOL:
    Genau, dieser ist vom Gedanken erstellt worden um die Berechtigungen auf der i zu Prüfen und Protokolliert alle Objekt-Zugriffe.
    Und genau das hilft mir bei vielen Analysen von Anwendungen, wenn ich wissen will welche Objektzugriffe, von welchen Programmen in welche Reihenfolge und zeitlichen Abständen getätigt werden.
    Ich verwende es mittlerweile sehr oft aber nur selten für Berechtigungsprüfungen.

    Ansonsten noch eine persönliche Meinung:
    Ich würde solche Arbeiten gleich komplett in der QSH abarbeiten lassen. Z.B. via Python.
    Sind meistens nur ein paar Zeilen code und funktioniert super. Habe schon viele solcher Apps in Produktion bei diversen Kunden.
    Läuft ohne Probleme und ist sehr simple.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Wenn du nur IFS-Dateien auslesen willst, kannst du dies inzwischen einfach und schnell per SQL tun und benötigst die C-Routinenen gar nicht mehr.
    Auch die Datenumsetzung (ANSI/ASCII->EBCDIC) passiert da vollautomatisch.
    Mit Open/Close hast du da dann nichts mehr zu tun.
    Ausnahmen sind natürlich STDIN/-OUT/-ERR, die man ja mit OVRDBF umleiten kann.
    Damit kann man i.Ü. auch den Output von QSH direkt in eine PF umleiten.

    https://www.ibm.com/docs/en/i/7.6.0?...able-functions
    Gibts nicht erst seit 7.6;-).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Bei Aufruf _C_IFS_FOPEN Deskriptor - Fehler
    By WiedemeierP in forum NEWSboard Programmierung
    Antworten: 16
    Letzter Beitrag: 10-04-19, 09:27
  2. QSH im CL/Batch Fehler qsh: 001-0014
    By camouflage in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 05-02-16, 09:02
  3. ?Viele User - Probleme mit Speicherbegrenzungen?
    By holgerscherer in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 01-02-11, 15:08
  4. RPG: zu viele offene Descriptoren ????
    By Siggi_ in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 14-01-09, 10:25
  5. Viele Probleme mit Datamax M-Class 4208
    By dr.chiller in forum NEWSboard Drucker
    Antworten: 0
    Letzter Beitrag: 13-05-08, 12:28

Tags for this Thread

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •