208 von 208 Codes
Die Operation erfordert Privilegien, die der Prozess nicht hat, etwa den Besitzer einer Datei ändern, ein Signal an einen Prozess eines anderen Benutzers senden oder eine unveränderliche Datei (chattr +i) bearbeiten. Anders als bei EACCES hilft es nicht, die Dateirechte zu ändern: Du brauchst root oder die entsprechende Capability.
Die Datei oder das Verzeichnis existiert nicht. Der Fehler tritt auch auf, wenn ein Zwischenverzeichnis im Pfad fehlt, ein symbolischer Link auf ein nicht existierendes Ziel zeigt oder der Interpreter aus der #!-Zeile eines Skripts nicht installiert ist.
Es gibt keinen Prozess, keine Prozessgruppe und keinen Thread mit dieser Kennung; zum Beispiel bei kill auf eine PID, die bereits beendet ist.
Ein Signal hat den Systemaufruf unterbrochen, bevor er fertig war. Das ist kein echter Fehler: Das Programm sollte den Aufruf wiederholen oder den Signal-Handler mit SA_RESTART installieren.
Ein-/Ausgabefehler auf niedriger Ebene, meist beim Lesen vom oder Schreiben auf das Gerät. Bei Festplatten deutet er oft auf defekte Sektoren oder ein fehlerhaftes Kabel hin: Prüfe dmesg und den SMART-Status. Er tritt auch auf, wenn auf ein bereits geschlossenes Terminal geschrieben wird.
Das Gerät oder die Adresse existiert nicht: Die Gerätedatei ist vorhanden, aber dahinter steckt keine Hardware, oder ein FIFO wurde mit O_NONBLOCK zum Schreiben geöffnet, ohne dass es einen Leser gibt.
Die Liste der Argumente und Umgebungsvariablen, die an exec übergeben wird, ist zu groß. Das ist das klassische „Argument list too long“ bei einem Wildcard, das zu Tausenden von Dateien expandiert; verwende find -exec oder xargs.
Die Datei hat kein erkanntes ausführbares Format: Sie ist ein Binary für eine andere Architektur, beschädigt oder ein Skript ohne #!-Zeile.
Der Dateideskriptor ist ungültig, wurde bereits geschlossen oder in einem Modus geöffnet, der die Operation nicht erlaubt, etwa Schreiben in einen nur zum Lesen geöffneten.
Der Prozess hat keine Kindprozesse, auf die er mit wait oder waitpid warten könnte, oft weil SIGCHLD ignoriert wird und die Kindprozesse automatisch eingesammelt werden.
Die Ressource ist vorübergehend nicht verfügbar, ein erneuter Versuch ist sinnvoll. Bei nicht blockierenden Operationen bedeutet er, dass noch keine Daten oder kein Platz vorhanden sind; bei fork, dass das Limit für Prozesse oder Threads erreicht ist (ulimit -u oder pids.max der cgroup).
Gleicher Wert:EWOULDBLOCK
Es ist nicht genug Speicher für die Operation vorhanden, oder ein Speicherlimit des Prozesses wurde überschritten. Bei fork oder mmap kann es an der Overcommit-Richtlinie, am Limit der cgroup oder an fehlendem Adressraum liegen.
Zugriff verweigert durch die Rechte der Datei oder eines Verzeichnisses im Pfad (für jedes ist das Ausführungsrecht nötig), durch eine ACL, durch SELinux oder AppArmor oder durch einen Mount mit noexec. bind gibt ihn auch zurück, wenn ohne Privilegien ein Port unter 1024 verwendet wird.
Einem Systemaufruf wurde ein Zeiger auf eine ungültige Speicheradresse übergeben. Das deutet auf einen Bug im Programm hin.
Die Operation braucht ein Blockgerät, etwa eine Festplatte, und hat einen anderen Dateityp erhalten; zum Beispiel beim Einhängen einer normalen Datei ohne -o loop.
Das Gerät oder die Ressource ist belegt. Typisch beim Aushängen eines Dateisystems, auf dem noch Dateien geöffnet sind oder in dem sich ein Terminal befindet; lsof oder fuser zeigen, welche Prozesse es verwenden.
Es gibt bereits eine Datei, ein Verzeichnis oder ein anderes Objekt mit diesem Namen, zum Beispiel beim Erstellen mit O_EXCL, bei mkdir ohne -p oder beim Anlegen eines Links, dessen Ziel bereits existiert.
Zwischen verschiedenen Dateisystemen lässt sich weder ein Hardlink anlegen noch eine Datei umbenennen. mv löst das durch Kopieren und Löschen; Programme, die rename() verwenden, müssen dasselbe tun.
Das Gerät existiert nicht oder unterstützt die Operation nicht; zum Beispiel beim Einhängen eines Dateisystemtyps, dessen Kernelmodul nicht geladen ist.
Ein Bestandteil des Pfads, der ein Verzeichnis sein sollte, ist eine Datei, oder es wurde ein Verzeichnis verlangt (O_DIRECTORY), und es ist keines.
Es wurde eine Dateioperation auf ein Verzeichnis versucht, etwa es zum Schreiben zu öffnen.
Ein Argument ist für den Aufruf ungültig: ein Wert außerhalb des Bereichs, eine unverträgliche Kombination von Optionen oder eine Operation, die das Objekt nicht unterstützt. Der Fehler ist allgemein: Die man-Page des Aufrufs listet die konkreten Fälle auf.
Die systemweite Tabelle der geöffneten Dateien ist erschöpft. Das Limit wird mit fs.file-max in sysctl eingestellt.
Der Prozess hat sein Limit an offenen Deskriptoren erreicht („Too many open files“). Erhöhe das Limit mit ulimit -n oder mit LimitNOFILE in systemd und prüfe, ob das Programm Dateien oder Sockets nicht schließt.
Eine Terminaloperation (ioctl) wurde auf etwas angewendet, das kein Terminal ist, zum Beispiel wenn die Ausgabe eines interaktiven Programms in eine Datei oder eine Pipe umgeleitet wird.
Die ausführbare Datei ist in Benutzung: Man kann nicht in ein Binary schreiben, während es läuft, und keines ausführen, das noch zum Schreiben geöffnet ist. Zum Aktualisieren schreibst du am besten eine neue Datei und benennst sie um.
Die Datei überschreitet die maximale Größe, die das Dateisystem zulässt (4 GB bei FAT32), oder das Limit RLIMIT_FSIZE des Prozesses.
Auf dem Gerät ist kein Platz mehr frei. Wenn df freien Platz anzeigt, prüfe die Inodes mit df -i. inotify gibt ihn auch zurück, wenn fs.inotify.max_user_watches ausgeschöpft ist.
lseek ist auf einer Pipe, einem FIFO oder einem Socket nicht möglich, weil sie keine Position haben.
Das Dateisystem ist schreibgeschützt eingehängt. Wenn es schreibgeschützt wurde, ohne dass jemand das verlangt hat, hat der Kernel Fehler erkannt: Prüfe dmesg und führe fsck aus.
Die maximale Anzahl an Hardlinks auf eine Datei wurde überschritten, bei manchen Dateisystemen auch die an Unterverzeichnissen eines Verzeichnisses.
Es wurde in eine Pipe oder einen Socket geschrieben, deren anderes Ende bereits geschlossen ist („Broken pipe“). Zusätzlich zum Fehler erhält der Prozess SIGPIPE; das ist normal, wenn der Leser früher endet, wie bei cmd | head.
Das Argument einer mathematischen Funktion liegt außerhalb ihres Definitionsbereichs, etwa die Quadratwurzel einer negativen Zahl.
Das Ergebnis einer Funktion ist zu groß oder zu klein, um dargestellt zu werden, oder ein Puffer reicht für das Ergebnis nicht aus, wie bei getcwd mit einem zu kurzen Puffer.
Ein Deadlock wurde verhindert: Der angeforderte Lock, etwa eine Dateisperre mit fcntl oder ein Mutex mit Fehlererkennung, hätte ewig gewartet.
Gleicher Wert:EDEADLOCK
Der Pfad oder einer seiner Bestandteile überschreitet die maximale Länge: unter Linux in der Regel 255 Bytes pro Name und 4096 pro Pfad.
Es sind keine Locks verfügbar. Bei NFS bedeutet das meist, dass der Sperrdienst (lockd oder rpc.statd) nicht läuft.
Der Systemaufruf existiert in diesem Kernel nicht oder ist nicht implementiert. Typisch bei Binaries, die für einen neueren Kernel kompiliert wurden, oder bei seccomp-Profilen von Containern, die neuere Aufrufe nicht kennen.
Das Verzeichnis ist nicht leer, zum Beispiel bei rmdir oder beim Umbenennen über ein bestehendes Verzeichnis. Um es samt Inhalt zu löschen, verwende rm -r.
Beim Auflösen des Pfads sind zu viele symbolische Links verkettet, normalerweise wegen einer Schleife, oder O_NOFOLLOW wurde auf einen symbolischen Link angewendet.
In der System-V-Nachrichtenwarteschlange gibt es keine Nachricht des angeforderten Typs.
Die System-V-IPC-Kennung (Warteschlange, Semaphor oder Shared Memory) wurde entfernt, während der Prozess sie verwendete.
Kanalnummer außerhalb des Bereichs. Ein Legacy-Code ohne praktische Verwendung unter Linux.
Level 2 nicht synchronisiert. Ein Legacy-Code aus System V ohne praktische Verwendung unter Linux.
Level 3 angehalten. Ein Legacy-Code aus System V ohne praktische Verwendung unter Linux.
Level 3 zurückgesetzt. Ein Legacy-Code aus System V ohne praktische Verwendung unter Linux.
Link-Nummer außerhalb des Bereichs. Ein Legacy-Code ohne praktische Verwendung unter Linux.
Der Protokolltreiber ist nicht angebunden. Nur wenige Subsysteme verwenden ihn, etwa einige Bluetooth-Treiber.
Keine CSI-Struktur verfügbar. Ein Legacy-Code ohne praktische Verwendung unter Linux.
Level 2 angehalten. Ein Legacy-Code aus System V ohne praktische Verwendung unter Linux.
Ungültiger Austausch. Ein Legacy-Code, den einige Treiber und Dateisysteme mit eigener Bedeutung wiederverwenden.
Ungültiger Anfragedeskriptor. Ein Legacy-Code, den einige Treiber mit eigener Bedeutung wiederverwenden.
Austausch voll. Ein Legacy-Code ohne praktische Verwendung unter Linux.
Kein „anode“ vorhanden. Ein Legacy-Code ohne praktische Verwendung unter Linux.
Ungültiger Anfragecode. Ein Legacy-Code; einige Treiber verwenden ihn für Befehle, die sie nicht unterstützen.
Ungültiger Slot. Ein Legacy-Code ohne praktische Verwendung unter Linux.
Ungültiges Format der Schriftartdatei. Ein Legacy-Code ohne praktische Verwendung unter Linux.
Das Gerät ist kein STREAM. Gehört zur STREAMS-Schnittstelle von System V, die Linux nicht implementiert.
Keine Daten verfügbar. Unter Linux gibt getxattr ihn zurück, wenn das erweiterte Attribut nicht existiert; unter macOS heißt dieser Fall ENOATTR.
Ein Timer ist abgelaufen. Stammt aus STREAMS; unter Linux verwenden ihn einige Treiber und io_uring für Operationen mit Zeitlimit.
Keine STREAMS-Ressourcen mehr verfügbar, eine Schnittstelle, die Linux nicht implementiert.
Der Rechner ist nicht im Netzwerk. Ein selten verwendeter Legacy-Code.
Das Paket ist nicht installiert. Ein Legacy-Code; einige Subsysteme verwenden ihn, wenn ein Modul fehlt, zum Beispiel ein kryptografisches.
Das Objekt ist entfernt. Bei NFS bezeichnet er einen Pfad, der von einem anderen Server exportiert wird.
Die Verbindung wurde getrennt. Ein Legacy-Code; einige Treiber verwenden ihn, wenn die Verbindung zum Gerät verloren geht.
Fehler bei „advertise“. Ein Legacy-Code aus RFS ohne Verwendung unter Linux.
Fehler bei „srmount“. Ein Legacy-Code aus RFS ohne Verwendung unter Linux.
Kommunikationsfehler beim Senden. Ein Legacy-Code; einige Netzwerk- und USB-Treiber verwenden ihn.
Protokollfehler: Die Gegenseite oder das Gerät hat etwas Unerwartetes geantwortet. Tritt bei USB-Geräten auf und bei Verbindungen, die mitten in einem Austausch abbrechen.
Es wurde ein mehrfacher Sprung (Multihop) versucht. Ein Legacy-Code aus RFS.
RFS-spezifischer Fehler. Ohne Verwendung unter Linux.
Die Nachricht ist fehlerhaft oder beschädigt. ext4, XFS und Btrfs geben ihn mit dem Alias EFSBADCRC zurück, wenn die Prüfsumme der Metadaten nicht stimmt.
Gleicher Wert:EFSBADCRC
Der Wert passt nicht in den Zieldatentyp; zum Beispiel ein 32-Bit-Programm, das ohne Unterstützung für große Dateien kompiliert wurde und eine Datei über 2 GB öffnet.
Der Name ist im Netzwerk nicht eindeutig. Ein Legacy-Code.
Der Dateideskriptor ist in einem falschen Zustand. ALSA und einige Treiber verwenden ihn, wenn das Gerät nicht bereit ist.
Die entfernte Adresse hat sich geändert. Ein Legacy-Code.
Auf eine benötigte Shared Library kann nicht zugegriffen werden. Ein Legacy-Code aus den a.out-Binaries.
Die Shared Library ist beschädigt. Ein Legacy-Code aus den a.out-Binaries.
Der .lib-Abschnitt des a.out-Binarys ist beschädigt. Ein Legacy-Code.
Es wurde versucht, zu viele Shared Libraries zu linken. Ein Legacy-Code aus a.out.
Eine Shared Library kann nicht direkt ausgeführt werden. Ein Legacy-Code aus a.out.
Die Bytefolge ist für die Zeichenkodierung ungültig, etwa ein Text, der kein gültiges UTF-8 ist, bei der Konvertierung mit iconv oder mit den Multibyte-Funktionen.
Der unterbrochene Aufruf muss neu gestartet werden. Wird intern vom Kernel verwendet und sollte nicht bei Programmen ankommen.
Pipe-Fehler von STREAMS. ALSA gibt ihn zurück, wenn das Audiogerät im Ruhezustand ist.
Zu viele Benutzer. Das Festplattenquotensystem gibt ihn zurück, wenn seine Tabelle voll ist; er ist selten.
Eine Socket-Operation wurde auf einen Deskriptor angewendet, der kein Socket ist.
Die Zieladresse fehlt: Über einen verbindungslosen Socket wurde gesendet, ohne anzugeben, wohin.
Die Nachricht ist zu groß für den Socket, etwa ein UDP-Datagramm, das größer als das Maximum oder als die MTU ist, wenn Fragmentierung nicht erlaubt ist.
Das Protokoll passt nicht zum Socket-Typ.
Die angeforderte Socket-Option oder das Protokoll ist nicht verfügbar, zum Beispiel eine Option von setsockopt, die der Kernel nicht kennt.
Das Protokoll wird nicht unterstützt, zum Beispiel weil sein Kernelmodul nicht geladen ist.
Der Socket-Typ wird in dieser Adressfamilie nicht unterstützt.
Die Operation wird vom Socket oder vom Objekt nicht unterstützt. Unter Linux hat er denselben Wert wie ENOTSUP, und viele Dateisysteme geben ihn für Funktionen zurück, die sie nicht implementieren, etwa fallocate oder erweiterte Attribute.
Die Operation wird nicht unterstützt. Unter Linux hat er denselben Wert wie EOPNOTSUPP (95); unter macOS sind es verschiedene Codes.
Die Protokollfamilie wird nicht unterstützt.
Die Adressfamilie wird nicht unterstützt; typisch bei IPv6 auf einem System oder in einem Container, in dem es deaktiviert ist.
Adresse und Port werden bereits verwendet: Ein anderer Prozess lauscht auf diesem Port, oder die vorherige Verbindung ist noch in TIME_WAIT. Finde den Prozess mit ss -ltnp oder lsof -i :PORT, oder verwende SO_REUSEADDR.
Die angeforderte Adresse kann nicht zugewiesen werden: Die IP gehört zu keiner Schnittstelle des Rechners, oder die ephemeren Ports für ausgehende Verbindungen sind erschöpft.
Die Netzwerkschnittstelle ist ausgefallen.
Das Zielnetz ist nicht erreichbar, weil es keine Route dorthin gibt. Prüfe die Routingtabelle und das Gateway; das passiert auch beim Verbinden über IPv6 ohne IPv6-Konnektivität.
Das Netzwerk hat die Verbindung zurückgesetzt, zum Beispiel wenn ein Keepalive fehlschlägt.
Die Verbindung wurde auf der lokalen Seite abgebrochen, zum Beispiel weil der Client sie geschlossen hat, bevor der Server sie mit accept angenommen hat.
Die Gegenseite hat die Verbindung abrupt mit einem RST getrennt („Connection reset by peer“): Der entfernte Prozess wurde beendet, eine Firewall oder ein Load Balancer hat die inaktive Verbindung getrennt, oder es wurden Daten gesendet, die die Gegenseite nicht erwartet hat.
Im Kernel ist kein Pufferplatz für die Netzwerkoperation verfügbar; tritt meist bei hohem Datenverkehr oder vollen Socket-Warteschlangen auf.
Der Socket ist bereits verbunden.
Der Socket ist nicht verbunden: Es wurde versucht, vor dem Verbinden zu senden oder zu empfangen, oder die Verbindung wurde bereits geschlossen. Bei einem FUSE-Mount erscheint er als „Transport endpoint is not connected“, wenn dessen Prozess gestorben ist; das behebst du durch Aushängen mit fusermount -u.
Nachdem diese Richtung des Sockets mit shutdown geschlossen wurde, kann nicht mehr gesendet werden.
Zu viele Referenzen; unter Linux beim Übergeben zu vieler verschachtelter Deskriptoren über einen Unix-Socket.
Die Wartezeit für die Verbindung ist abgelaufen, weil das Ziel nicht geantwortet hat. Meist liegt es an einer Firewall, die Pakete stillschweigend verwirft, an einem ausgeschalteten Host oder an einer Route, die nicht ankommt.
Das Ziel hat die Verbindung abgelehnt: Der Rechner antwortet, aber auf diesem Port lauscht niemand, oder eine Firewall antwortet mit einer Ablehnung. Prüfe, ob der Dienst läuft und auf der richtigen Schnittstelle lauscht, nicht nur auf 127.0.0.1.
Der Zielhost ist ausgefallen.
Es gibt keine Route zum Host: Er antwortet im lokalen Netz nicht auf ARP, oder ein Router oder eine Firewall meldet, dass er nicht erreichbar ist.
Auf dem Socket läuft bereits eine Operation, etwa ein nicht blockierendes connect, das noch nicht abgeschlossen ist.
Die Operation läuft: Ein nicht blockierendes connect wurde gestartet und wird später abgeschlossen. Das ist kein Fehler; warte mit poll oder select.
Das Datei-Handle ist veraltet: Bei NFS wurde die Datei oder das Verzeichnis auf dem Server gelöscht oder ersetzt. Abhilfe schafft erneutes Öffnen des Pfads oder erneutes Einhängen.
Die Struktur muss bereinigt werden: Das Dateisystem hat eine Beschädigung erkannt (bei ext4 und XFS mit dem Alias EFSCORRUPTED). Hänge es aus und führe fsck oder xfs_repair aus.
Gleicher Wert:EFSCORRUPTED
Keine benannte XENIX-Datei. Ein ungenutzter Legacy-Code.
Keine XENIX-Semaphoren verfügbar. Ein ungenutzter Legacy-Code.
Ist eine benannte XENIX-Datei. Ein ungenutzter Legacy-Code.
Entfernter E/A-Fehler, zum Beispiel von einem I2C-Gerät oder einer entfernten Festplatte, die nicht geantwortet hat.
Das Festplattenkontingent des Benutzers oder der Gruppe wurde überschritten.
Im Gerät ist kein Medium, etwa ein Laufwerk ohne Disc oder ein leerer Kartenleser.
Der Medientyp ist falsch.
Die Operation wurde abgebrochen, zum Beispiel eine asynchrone E/A oder ein Warten von io_uring.
Der benötigte Schlüssel ist nicht im Keyring des Kernels. Tritt bei verschlüsselten Dateisystemen wie fscrypt oder eCryptfs auf, wenn der Schlüssel nicht geladen wurde.
Der Schlüssel ist abgelaufen. PAM und Kerberos verwenden ihn auch, wenn das Passwort oder das Ticket abgelaufen ist.
Der Schlüssel wurde widerrufen.
Der Dienst hat den Schlüssel abgelehnt.
Der Besitzer eines robusten Mutex ist gestorben, ohne ihn freizugeben. Der neue Besitzer muss den geschützten Zustand konsistent machen und pthread_mutex_consistent aufrufen.
Der durch einen robusten Mutex geschützte Zustand kann nicht wiederhergestellt werden, weil der vorherige Besitzer gestorben ist und niemand ihn als konsistent markiert hat.
Die Operation ist nicht möglich, weil das WLAN- oder Bluetooth-Funkmodul durch RF-kill blockiert ist. Prüfe rfkill list, den Hardwareschalter oder die Flugmodus-Taste.
Die Speicherseite hat einen Hardwarefehler, und der Kernel hat sie als vergiftet markiert.
Der Dateityp ist für die Operation ungeeignet. Unter macOS und BSD gibt es ihn schon lange; unter Linux wurde er erst kürzlich hinzugefügt.
Zu viele Prozesse. BSD definiert ihn für das Prozesslimit, in der Praxis gibt fork aber EAGAIN zurück.
Die RPC-Struktur ist fehlerhaft (Sun RPC, das NFS verwendet).
Die RPC-Version stimmt nicht überein (Sun RPC, das NFS verwendet).
Das RPC-Programm ist auf dem Server nicht verfügbar.
Die Version des RPC-Programms stimmt nicht überein.
Die Prozedur existiert im RPC-Programm nicht.
Authentifizierungsfehler, zum Beispiel beim Einhängen einer NFS-Freigabe.
Für die Operation wird ein Authentifikator benötigt.
Das Gerät ist ausgeschaltet.
Gerätefehler, zum Beispiel ein Drucker ohne Papier.
Die ausführbare Datei ist ungültig.
Die ausführbare Datei ist für einen anderen CPU-Typ, etwa ein reines x86_64-Binary auf einem Mac mit Apple Silicon ohne Rosetta 2 oder ein ARM-Binary auf einem Mac mit Intel.
Die Version der Shared Library stimmt nicht überein.
Die Mach-O-Datei ist fehlerhaft oder beschädigt.
Das erweiterte Attribut existiert nicht; entspricht ENODATA unter Linux. Tritt bei xattr auf, zum Beispiel beim Entfernen von com.apple.quarantine von einer Datei, die es nicht hat.
Im MAC Framework ist keine Richtlinie mit diesem Namen registriert.
Die Ausgabewarteschlange der Netzwerkschnittstelle ist voll.
Die Capabilities reichen nicht aus: Aufrufe, die eine Sandbox einschränkt, geben ihn zurück.
Das Terminal, das den Prozess steuerte, wurde geschlossen, oder die SSH-Sitzung wurde getrennt. Viele Daemons wie nginx, sshd oder rsyslog verstehen es als Aufforderung, die Konfiguration neu zu laden; nohup, tmux und screen verhindern, dass es die Prozesse beim Abmelden beendet.
Unterbrechung über die Tastatur mit Ctrl+C. Das Programm kann es abfangen, um sich geordnet zu beenden. Exit-Code 130.
Beenden über die Tastatur mit Ctrl+\. Beendet den Prozess mit Core-Dump; die JVM verwendet es dagegen, um den Zustand der Threads auszugeben.
Der Prozessor ist auf eine illegale Instruktion gestoßen: ein Binary, das für eine neuere CPU kompiliert wurde (zum Beispiel mit AVX2 oder AVX-512 auf einem Prozessor, der sie nicht hat), beschädigter Code oder ein Sprung in Daten.
Debug-Trap: Debugger verwenden es für Haltepunkte. Kommt es ohne Debugger, ist es meist ein Fehler, den das Programm selbst erkannt hat, wie die Prüfungen von Swift unter macOS.
Der Prozess hat abort() aufgerufen: eine fehlgeschlagene Assertion, eine nicht abgefangene C++-Ausnahme oder eine von der C-Bibliothek erkannte Heap-Beschädigung („double free or corruption“). Exit-Code 134.
Gleicher Wert:SIGIOT
Busfehler: ein Zugriff auf falsch ausgerichteten Speicher auf manchen Architekturen oder auf einen Teil einer mit mmap eingeblendeten Datei, der nicht mehr existiert, weil die Datei gekürzt wurde. Passiert auch, wenn /dev/shm voll ist.
Arithmetische Ausnahme. Trotz des Namens ist die häufigste Ursache eine Ganzzahldivision durch null.
Beendet den Prozess sofort: Es kann weder abgefangen noch blockiert noch ignoriert werden. Gesendet wird es von kill -9, vom OOM Killer des Kernels, wenn der Speicher ausgeht, und von Docker oder Kubernetes, wenn ein Container sein Speicherlimit überschreitet (OOMKilled) oder sich nach SIGTERM nicht rechtzeitig beendet. Exit-Code 137.
Freies Signal, das jede Anwendung für eigene Zwecke nutzen kann; zum Beispiel meldet dd damit seinen Fortschritt, und nginx öffnet die Logs neu.
Segmentverletzung („Segmentation fault“): ein Zugriff auf ungültigen Speicher, etwa das Dereferenzieren eines Nullzeigers, das Überschreiten der Grenzen eines Arrays oder ein Stacküberlauf durch eine Endlosrekursion. Exit-Code 139.
Zweites freies Signal, das jede Anwendung für eigene Zwecke nutzen kann.
Schreiben in eine Pipe oder einen Socket ohne Leser. Normal bei cmd | head, wo der Leser früher endet; Server ignorieren es meist und behandeln den Fehler EPIPE. Exit-Code 141.
Der mit alarm oder setitimer gestellte Timer ist abgelaufen.
Aufforderung zum geordneten Beenden. Es ist das Standardsignal von kill, systemctl stop, docker stop und von Kubernetes beim Löschen eines Pods; der Prozess sollte seine Verbindungen schließen und sich beenden. Exit-Code 143.
Stackfehler des Koprozessors. Wird im aktuellen Linux nicht verwendet.
Ein Kindprozess wurde beendet, angehalten oder fortgesetzt. Der Elternprozess muss ihn mit wait einsammeln; tut er das nicht, bleibt das Kind als Zombie zurück.
Gleicher Wert:SIGCLD
Setzt einen angehaltenen Prozess fort, wie es fg und bg in der Shell tun.
Hält den Prozess an; es kann weder abgefangen noch ignoriert werden. Fortgesetzt wird er mit SIGCONT.
Anhalten über das Terminal mit Ctrl+Z. Anders als SIGSTOP kann das Programm es abfangen.
Ein Hintergrundprozess hat versucht, vom Terminal zu lesen.
Ein Hintergrundprozess hat versucht, bei aktivem stty tostop auf das Terminal zu schreiben oder dessen Konfiguration zu ändern.
Auf einem Socket sind dringende Daten (Out-of-Band) eingetroffen. Go verwendet es intern, um Goroutinen zu unterbrechen.
Das CPU-Zeitlimit des Prozesses wurde überschritten (ulimit -t).
Die für den Prozess zulässige maximale Dateigröße wurde überschritten (ulimit -f).
Der virtuelle Timer ist abgelaufen, der nur die CPU-Zeit des Prozesses zählt.
Der Profiling-Timer ist abgelaufen, den Profiler verwenden.
Die Größe des Terminalfensters hat sich geändert; Vollbildprogramme nutzen es, um sich neu zu zeichnen.
Auf einem mit O_ASYNC konfigurierten Deskriptor ist E/A möglich. Unter Linux ist SIGPOLL dasselbe Signal.
Gleicher Wert:SIGPOLL
Stromausfall, den eine USV-Software dem init-System meldet.
Ungültiger Systemaufruf. Heute ist die übliche Ursache ein seccomp-Filter, der ihn blockiert, etwa in Containern.
Emulator-Trap (EMT). Gibt es unter macOS und BSD, aber nicht unter Linux auf x86 oder ARM.
Informationsanforderung mit Ctrl+T im Terminal von macOS und BSD; viele Befehle reagieren darauf, indem sie ihren Fortschritt anzeigen.
Der Befehl wurde erfolgreich beendet. Es ist der einzige Code, der Erfolg bedeutet: Jeder andere Wert zeigt einen Fehler an.
Allgemeiner Fehler; jedes Programm legt selbst fest, was er bedeutet. Die Details stehen meist in dem, was der Befehl auf stderr ausgegeben hat. grep und diff verwenden ihn mit anderer Bedeutung: „keine Treffer gefunden“ bzw. „die Dateien unterscheiden sich“.
Falsche Verwendung eines Shell-Builtins oder Syntaxfehler im Skript. Viele Programme verwenden ihn auch für ungültige Optionen, und grep für echte Fehler.
Der Befehl wurde falsch verwendet: Es fehlen Argumente, es sind zu viele, oder eine Option ist falsch.
Die Eingabedaten haben ein falsches Format.
Eine Eingabedatei existiert nicht oder kann nicht gelesen werden.
Der angegebene Benutzer existiert nicht; wird vor allem von Mailprogrammen verwendet.
Der Hostname existiert nicht.
Ein benötigter Dienst ist nicht verfügbar, oder etwas ist fehlgeschlagen, das in keine andere Kategorie passt.
Interner Fehler des Programms.
Fehler des Betriebssystems, etwa wenn fork nicht möglich ist oder keine Pipe erstellt werden kann.
Eine Systemdatei wie /etc/passwd fehlt oder enthält einen Fehler.
Eine Ausgabedatei kann nicht erstellt werden.
Ein-/Ausgabefehler beim Lesen oder Schreiben einer Datei.
Vorübergehender Fehler: Ein späterer erneuter Versuch ist sinnvoll. Mailserver verwenden ihn, um die Nachricht in der Warteschlange zu behalten.
Das entfernte System hat etwas geantwortet, das nicht dem Protokoll entspricht.
Unzureichende Berechtigungen für die Operation.
Die Konfiguration enthält einen Fehler.
Der Befehl timeout hat ihn beendet, weil er die angegebene Zeit überschritten hat.
docker run selbst ist fehlgeschlagen, bevor der Container ausgeführt wurde, etwa wegen einer falschen Option oder eines Fehlers des Daemons. GNU timeout gibt ihn auch zurück, wenn timeout selbst fehlschlägt.
Die Datei existiert, kann aber nicht ausgeführt werden: Es fehlt das Ausführungsrecht, es ist ein Verzeichnis oder ein Binary für eine andere Architektur. Bei Docker ist der Befehl des Containers nicht ausführbar.
Der Befehl wurde nicht gefunden: Er ist nicht installiert, nicht im PATH oder falsch geschrieben. In Skripten tritt er auch auf, wenn der Interpreter aus der #!-Zeile fehlt; bei Docker, wenn der Befehl des Containers im Image nicht existiert.
Codes über 128 zeigen an, dass ein Signal den Prozess beendet hat, aber 128 entspricht keinem. Git verwendet ihn für alle seine fatalen Fehler („fatal: …“), etwa ein nicht existierendes Repository oder einen Authentifizierungsfehler beim Klonen.
Der Exit-Code lag außerhalb des Bereichs: exit -1 kommt als 255 an, weil nur 8 Bits erhalten bleiben. ssh gibt ihn auch zurück, wenn die Verbindung oder die Authentifizierung fehlschlägt, um ihn vom Code des entfernten Befehls zu unterscheiden.
Die Linux-Werte gelten für x86, x86-64 und ARM; Alpha, MIPS, SPARC und PA-RISC nummerieren einige errno und Signale anders. Die englischen Meldungen sind die, die strerror und strsignal in glibc anzeigen, und die von macOS, wenn sie abweichen. Exit-Codes über 128 werden als 128 plus die Signalnummer interpretiert, nach der Konvention von bash, Docker und Kubernetes.
So funktioniert es
Wenn ein Systemaufruf unter Linux fehlschlägt, gibt er -1 zurück und legt in der Variablen errno eine Zahl ab, die den Grund angibt: 2 ist ENOENT, die Datei existiert nicht; 13 ist EACCES, Zugriff verweigert. strerror wandelt diese Zahl in den Text um, den man auf dem Bildschirm sieht, etwa „No such file or directory“. Python zeigt sie als [Errno 13], Node.js als code: 'ECONNREFUSED' und Go, Rust oder Java mit demselben Text. Die Nummern 1 bis 34 stammen aus dem ursprünglichen Unix und sind auf allen Systemen gleich; die folgenden hat jedes System auf eigene Weise nummeriert, deshalb ist ECONNREFUSED unter Linux 111 und unter macOS 61. Der Name ist portabel, die Nummer nicht.
Signale sind Benachrichtigungen, die der Kernel oder ein anderer Prozess an einen Prozess sendet: SIGINT beim Drücken von Ctrl+C, SIGTERM, um ihn zum Beenden aufzufordern, SIGKILL, um ihn ohne Rückfrage zu beenden, SIGSEGV, wenn er auf ungültigen Speicher zugreift. Jedes hat eine Standardaktion, und fast alle lassen sich abfangen, um etwas anderes zu tun. Wenn ein Signal einen Prozess beendet, meldet die Shell als Exit-Code 128 plus die Signalnummer: 137 ist SIGKILL (9), 139 ist SIGSEGV (11) und 143 ist SIGTERM (15). Docker und Kubernetes verwenden dieselbe Konvention.
Der Exit-Code ist die Zahl, die ein Programm beim Beenden hinterlässt: 0 bedeutet Erfolg, jeder andere Wert einen Fehler. Es bleiben nur 8 Bits erhalten, daher reicht er von 0 bis 255. Es gibt nur wenige Konventionen: 126 und 127 verwendet die Shell, wenn sie den Befehl nicht ausführen kann oder nicht findet, 64 bis 78 definiert sysexits.h von BSD, und den Rest legt jedes Programm selbst fest, wie grep, das 1 zurückgibt, wenn es nichts findet.
Beispiele
Last State: Terminated · Reason: OOMKilled · Exit Code: 137137 = 128 + 9 · SIGKILLDer Container hat sein Speicherlimit überschritten, und der Kernel hat ihn mit SIGKILL beendet. Du musst das Limit in resources.limits.memory erhöhen oder herausfinden, warum der Prozess so viel verbraucht; ein Neustart behebt das nicht.Error: connect ECONNREFUSED 127.0.0.1:5432ECONNREFUSED · Linux 111 · macOS 61 · Connection refusedNode.js konnte keine Verbindung zu PostgreSQL herstellen, weil niemand auf Port 5432 lauscht. Läuft die Anwendung in einem Container, ist 127.0.0.1 der Container selbst und nicht der Host: Verwende den Namen des Datenbankdienstes.OSError: [Errno 48] Address already in useEADDRINUSE · Linux 98 · macOS 48Die 48 verrät, dass das Programm unter macOS läuft: Unter Linux ist derselbe Fehler die 98. In beiden Fällen verwendet bereits ein anderer Prozess den Port; lsof -i :PORT zeigt, welcher.Anwendungsfälle
- Einen Fehler einer Anwendung in Python, Node.js, Go oder C verstehen, die nur die Nummer oder den Namen des errno anzeigt.
- Anhand des Exit-Codes herausfinden, warum ein Docker-Container beendet wurde oder ein Kubernetes-Pod neu startet.
- Eine errno-Nummer von macOS dem richtigen Namen zuordnen, die ab 35 nicht mit der von Linux übereinstimmt.
- Den Exit-Code eines fehlgeschlagenen Skripts, Cronjobs oder CI-Jobs interpretieren.
- Entscheiden, welches Signal du mit kill sendest, und wissen, was der Prozess tut, wenn er es nicht abfängt.
- Eine portable Fehlerbehandlung schreiben, die nach Name statt nach Nummer vergleicht.
Häufige Fragen
Was bedeutet der Exit-Code 137?
Dass der Prozess durch das Signal 9, SIGKILL, beendet wurde (128 + 9). Die häufigste Ursache ist der Speicher: Der Container hat sein Limit überschritten, was Kubernetes als OOMKilled meldet, oder der OOM Killer des Kernels hat diesen Prozess ausgewählt, was in dmesg als „Out of memory: Killed process“ erscheint. Es passiert auch bei docker kill oder wenn sich der Prozess nach SIGTERM nicht innerhalb der Frist beendet: 10 Sekunden bei docker stop und 30 bei Kubernetes.
Was ist der Unterschied zwischen SIGTERM und SIGKILL?
SIGTERM fordert den Prozess auf, sich zu beenden, und der Prozess kann es abfangen, um Verbindungen zu schließen, Daten zu speichern und sich zu beenden. Bei SIGKILL beendet der Kernel ihn sofort, ohne dass der Prozess etwas tun kann. Richtig ist, SIGTERM zu senden, einige Sekunden zu warten und nur dann auf SIGKILL zurückzugreifen, wenn er noch läuft; genau das tun systemd, docker stop und Kubernetes.
Warum hat derselbe errno unter macOS eine andere Nummer?
Weil POSIX die Namen definiert, aber nicht die Nummern. Die Nummern 1 bis 34 haben alle Systeme vom ursprünglichen Unix übernommen; danach haben BSD, von dem macOS abstammt, und System V, dem Linux folgte, sie getrennt nummeriert. Deshalb solltest du immer nach Name vergleichen, mit errno.ECONNREFUSED in Python, err.code in Node.js oder der Konstante in C, und nicht nach der Nummer.
Was ist der Unterschied zwischen EACCES und EPERM?
EACCES („Permission denied“) bedeutet, dass die Rechte der Datei oder eines Verzeichnisses im Pfad es nicht erlauben oder dass eine ACL oder SELinux es verhindert: Das löst du mit chmod, chown oder der entsprechenden Richtlinie. EPERM („Operation not permitted“) bedeutet, dass die Operation selbst Privilegien erfordert, unabhängig von den Rechten, etwa den Besitzer einer Datei ändern oder einen Prozess eines anderen Benutzers beenden: Dafür brauchst du root oder eine Capability, oder du musst ein Attribut wie das der Unveränderlichkeit entfernen.
Wie sehe ich den Exit-Code eines Befehls oder eines Containers?
In bash und zsh zeigt echo $? den des letzten Befehls; in PowerShell $LASTEXITCODE. Bei Docker zeigt docker ps -a ihn in der Spalte STATUS an, etwa „Exited (137)“. Bei Kubernetes zeigt kubectl describe pod ihn unter „Last State: Terminated“ an, zusammen mit dem Grund, etwa OOMKilled oder Error.