208 van 208 codes
De bewerking vereist rechten die het proces niet heeft, zoals de eigenaar van een bestand wijzigen, een signaal sturen naar een proces van een andere gebruiker of een onveranderbaar bestand (chattr +i) aanpassen. Anders dan bij EACCES los je dit niet op door de bestandsrechten te wijzigen: je hebt root of de bijbehorende capability nodig.
Het bestand of de map bestaat niet. Dit verschijnt ook als een tussenliggende map in het pad ontbreekt, als een symbolische link naar een doel wijst dat niet bestaat of als de interpreter uit de #!-regel van een script niet is geïnstalleerd.
Er bestaat geen proces, procesgroep of thread met die identificatie; bijvoorbeeld bij kill op een PID die al beëindigd is.
Een signaal heeft de systeemaanroep onderbroken voordat die klaar was. Het is geen echte fout: het programma moet de aanroep opnieuw proberen, of de signaalhandler installeren met SA_RESTART.
Invoer-/uitvoerfout op laag niveau, meestal bij het lezen van of schrijven naar het apparaat. Bij schijven wijst dit vaak op beschadigde sectoren of een defecte kabel: controleer dmesg en de SMART-status. Het verschijnt ook bij het schrijven naar een terminal die al gesloten is.
Het apparaat of het adres bestaat niet: het apparaatbestand is er, maar er zit geen hardware achter, of een FIFO is met O_NONBLOCK geopend om te schrijven zonder dat er een lezer is.
De lijst met argumenten en omgevingsvariabelen die aan exec wordt doorgegeven, is te groot. Dit is de klassieke „Argument list too long” bij een wildcard die uitklapt tot duizenden bestanden; gebruik find -exec of xargs.
Het bestand heeft geen herkend uitvoerbaar formaat: het is een binary voor een andere architectuur, het is beschadigd of het is een script zonder #!-regel.
De bestandsdescriptor is ongeldig, is al gesloten of is geopend in een modus die de bewerking niet toestaat, zoals schrijven naar een descriptor die alleen voor lezen is geopend.
Het proces heeft geen kindprocessen om met wait of waitpid op te wachten, vaak omdat SIGCHLD wordt genegeerd en de kindprocessen automatisch worden opgeruimd.
De bron is tijdelijk niet beschikbaar en het is zinvol het opnieuw te proberen. Bij niet-blokkerende bewerkingen betekent het dat er nog geen gegevens of ruimte zijn; bij fork dat de limiet voor processen of threads is bereikt (ulimit -u of pids.max van de cgroup).
Zelfde waarde:EWOULDBLOCK
Er is niet genoeg geheugen voor de bewerking, of een geheugenlimiet van het proces is overschreden. Bij fork of mmap kan het komen door het overcommit-beleid, de limiet van de cgroup of een gebrek aan adresruimte.
Toegang geweigerd door de rechten van het bestand of van een map in het pad (op elk ervan is uitvoerrecht nodig), door een ACL, door SELinux of AppArmor, of door een mount met noexec. bind geeft dit ook terug bij gebruik van een poort onder 1024 zonder rechten.
Er is aan een systeemaanroep een pointer naar een ongeldig geheugenadres doorgegeven. Dit wijst op een bug in het programma.
De bewerking heeft een blokapparaat nodig, zoals een schijf, en kreeg een ander type bestand; bijvoorbeeld bij het mounten van een gewoon bestand zonder -o loop.
Het apparaat of de bron is in gebruik. Typisch bij het ontkoppelen van een bestandssysteem met open bestanden of met een terminal die zich erin bevindt; lsof of fuser laten zien welke processen het gebruiken.
Er bestaat al een bestand, een map of een ander object met die naam, bijvoorbeeld bij het aanmaken met O_EXCL, bij mkdir zonder -p of bij het maken van een link waarvan het doel al bestaat.
Tussen verschillende bestandssystemen kun je geen harde link maken en geen bestand hernoemen. mv lost dit op door te kopiëren en te verwijderen; programma's die rename() gebruiken, moeten hetzelfde doen.
Het apparaat bestaat niet of ondersteunt de bewerking niet; bijvoorbeeld bij het mounten van een bestandssysteemtype waarvan de kernelmodule niet geladen is.
Een onderdeel van het pad dat een map zou moeten zijn, is een bestand, of er werd een map gevraagd (O_DIRECTORY) en het is er geen.
Er werd een bestandsbewerking op een map geprobeerd, zoals die openen om te schrijven.
Een argument is ongeldig voor de aanroep: een waarde buiten het bereik, een onverenigbare combinatie van opties of een bewerking die het object niet ondersteunt. De fout is generiek: de man-pagina van de aanroep somt de concrete gevallen op.
De systeembrede tabel met geopende bestanden is vol. De limiet stel je in met fs.file-max in sysctl.
Het proces heeft zijn limiet voor open descriptors bereikt („Too many open files”). Verhoog de limiet met ulimit -n of met LimitNOFILE in systemd, en controleer of het programma geen bestanden of sockets open laat.
Er werd een terminalbewerking (ioctl) gevraagd op iets wat geen terminal is, bijvoorbeeld wanneer de uitvoer van een interactief programma naar een bestand of een pipe wordt omgeleid.
Het uitvoerbare bestand is in gebruik: je kunt niet naar een binary schrijven terwijl die draait, en ook geen binary uitvoeren die nog open staat om te schrijven. Om het bij te werken schrijf je het best een nieuw bestand en hernoem je dat.
Het bestand overschrijdt de maximale grootte die het bestandssysteem toestaat (4 GB bij FAT32) of de limiet RLIMIT_FSIZE van het proces.
Er is geen ruimte meer op het apparaat. Als df vrije ruimte toont, controleer dan de inodes met df -i. inotify geeft dit ook terug als fs.inotify.max_user_watches is uitgeput.
lseek is niet mogelijk op een pipe, een FIFO of een socket, omdat die geen positie hebben.
Het bestandssysteem is alleen-lezen gemount. Als het alleen-lezen werd zonder dat iemand daarom vroeg, heeft de kernel fouten gedetecteerd: controleer dmesg en voer fsck uit.
Het maximale aantal harde links naar een bestand is overschreden, of bij sommige bestandssystemen het maximale aantal submappen van een map.
Er werd geschreven naar een pipe of een socket waarvan de andere kant al gesloten is („Broken pipe”). Naast de fout ontvangt het proces SIGPIPE; dit is normaal als de lezer eerder stopt, zoals bij cmd | head.
Het argument van een wiskundige functie valt buiten het domein ervan, zoals de vierkantswortel van een negatief getal.
Het resultaat van een functie is te groot of te klein om te worden weergegeven, of een buffer is te klein voor het resultaat, zoals bij getcwd met een te korte buffer.
Er werd een deadlock voorkomen: de gevraagde lock, zoals een bestandsvergrendeling met fcntl of een mutex met foutdetectie, zou eeuwig zijn blijven wachten.
Zelfde waarde:EDEADLOCK
Het pad of een van de onderdelen ervan overschrijdt de maximale lengte: in Linux doorgaans 255 bytes per naam en 4096 per pad.
Er zijn geen locks beschikbaar. Bij NFS betekent dit meestal dat de vergrendelingsdienst (lockd of rpc.statd) niet draait.
De systeemaanroep bestaat niet in deze kernel of is niet geïmplementeerd. Typisch voor binaries die voor een nieuwere kernel zijn gecompileerd, of voor seccomp-profielen van containers die recente aanroepen niet kennen.
De map is niet leeg, bijvoorbeeld bij rmdir of bij het hernoemen over een bestaande map. Gebruik rm -r om hem met inhoud en al te verwijderen.
Er zijn te veel symbolische links aan elkaar geschakeld bij het oplossen van het pad, meestal door een lus, of O_NOFOLLOW werd gebruikt op een symbolische link.
Er is geen bericht van het gevraagde type in de System V-berichtenwachtrij.
De System V-IPC-identificatie (wachtrij, semafoor of gedeeld geheugen) werd verwijderd terwijl het proces die gebruikte.
Kanaalnummer buiten bereik. Een verouderde code zonder praktisch nut in Linux.
Niveau 2 niet gesynchroniseerd. Een verouderde code uit System V zonder praktisch nut in Linux.
Niveau 3 gestopt. Een verouderde code uit System V zonder praktisch nut in Linux.
Niveau 3 gereset. Een verouderde code uit System V zonder praktisch nut in Linux.
Linknummer buiten bereik. Een verouderde code zonder praktisch nut in Linux.
De protocoldriver is niet gekoppeld. Weinig subsystemen gebruiken dit, zoals sommige Bluetooth-drivers.
Er is geen CSI-structuur beschikbaar. Een verouderde code zonder praktisch nut in Linux.
Niveau 2 gestopt. Een verouderde code uit System V zonder praktisch nut in Linux.
Ongeldige uitwisseling. Een verouderde code die sommige drivers en bestandssystemen met een eigen betekenis hergebruiken.
Ongeldige aanvraagdescriptor. Een verouderde code die sommige drivers met een eigen betekenis hergebruiken.
Uitwisseling vol. Een verouderde code zonder praktisch nut in Linux.
Er is geen „anode”. Een verouderde code zonder praktisch nut in Linux.
Ongeldige aanvraagcode. Verouderd; sommige drivers gebruiken hem voor opdrachten die ze niet ondersteunen.
Ongeldig slot. Een verouderde code zonder praktisch nut in Linux.
Onjuist formaat van lettertypebestand. Een verouderde code zonder praktisch nut in Linux.
Het apparaat is geen STREAM. Hoort bij de STREAMS-interface van System V, die Linux niet implementeert.
Er zijn geen gegevens beschikbaar. In Linux geeft getxattr dit terug als het uitgebreide attribuut niet bestaat; in macOS is dat geval ENOATTR.
Een timer is verlopen. Komt uit STREAMS; in Linux gebruiken sommige drivers en io_uring hem voor bewerkingen met een tijdslimiet.
Er zijn geen STREAMS-bronnen meer, een interface die Linux niet implementeert.
De machine zit niet in het netwerk. Een weinig gebruikte verouderde code.
Het pakket is niet geïnstalleerd. Verouderd; sommige subsystemen gebruiken hem als er een module ontbreekt, bijvoorbeeld een cryptografische.
Het object is extern. Bij NFS geeft het een pad aan dat vanaf een andere server wordt geëxporteerd.
De verbinding is verbroken. Verouderd; sommige drivers gebruiken hem als de verbinding met het apparaat wegvalt.
Fout bij „advertise”. Een verouderde code uit RFS zonder nut in Linux.
Fout bij „srmount”. Een verouderde code uit RFS zonder nut in Linux.
Communicatiefout bij het verzenden. Verouderd; sommige netwerk- en USB-drivers gebruiken hem.
Protocolfout: de andere kant of het apparaat antwoordde iets onverwachts. Verschijnt bij USB-apparaten en bij verbindingen die midden in een uitwisseling wegvallen.
Er werd een meervoudige sprong (multihop) geprobeerd. Een verouderde code uit RFS.
RFS-specifieke fout. Niet gebruikt in Linux.
Het bericht is misvormd of beschadigd. ext4, XFS en Btrfs geven dit terug, met de alias EFSBADCRC, als de checksum van de metadata niet klopt.
Zelfde waarde:EFSBADCRC
De waarde past niet in het doelgegevenstype; bijvoorbeeld een 32-bitsprogramma dat zonder ondersteuning voor grote bestanden is gecompileerd en een bestand van meer dan 2 GB opent.
De naam is niet uniek in het netwerk. Een verouderde code.
De bestandsdescriptor bevindt zich in een onjuiste toestand. ALSA en sommige drivers gebruiken hem als het apparaat niet gereed is.
Het externe adres is gewijzigd. Een verouderde code.
Een benodigde gedeelde bibliotheek is niet toegankelijk. Een verouderde code uit de a.out-binaries.
De gedeelde bibliotheek is beschadigd. Een verouderde code uit de a.out-binaries.
De .lib-sectie van de a.out-binary is beschadigd. Een verouderde code.
Er werd geprobeerd te veel gedeelde bibliotheken te linken. Een verouderde code uit a.out.
Een gedeelde bibliotheek kan niet rechtstreeks worden uitgevoerd. Een verouderde code uit a.out.
De bytereeks is ongeldig voor de tekencodering, zoals een tekst die geen geldige UTF-8 is, bij het converteren met iconv of met de multibytefuncties.
De onderbroken aanroep moet opnieuw worden gestart. Wordt intern door de kernel gebruikt en zou programma's niet moeten bereiken.
Pipefout van STREAMS. ALSA geeft dit terug als het audioapparaat in de slaapstand staat.
Te veel gebruikers. Het schijfquotasysteem geeft dit terug als zijn tabel vol is; het komt zelden voor.
Er werd een socketbewerking gebruikt op een descriptor die geen socket is.
Het bestemmingsadres ontbreekt: er werd verzonden via een verbindingsloze socket zonder aan te geven waarheen.
Het bericht is te groot voor de socket, zoals een UDP-datagram dat groter is dan het maximum of dan de MTU wanneer fragmentatie niet is toegestaan.
Het protocol past niet bij het sockettype.
De gevraagde socketoptie of het gevraagde protocol is niet beschikbaar, bijvoorbeeld een optie van setsockopt die de kernel niet kent.
Het protocol wordt niet ondersteund, bijvoorbeeld omdat de kernelmodule ervan niet geladen is.
Het sockettype wordt niet ondersteund in die adresfamilie.
De bewerking wordt niet ondersteund door de socket of door het object. In Linux heeft hij dezelfde waarde als ENOTSUP, en veel bestandssystemen geven hem terug voor functies die ze niet implementeren, zoals fallocate of uitgebreide attributen.
De bewerking wordt niet ondersteund. In Linux heeft hij dezelfde waarde als EOPNOTSUPP (95); in macOS zijn het verschillende codes.
De protocolfamilie wordt niet ondersteund.
De adresfamilie wordt niet ondersteund; typisch bij gebruik van IPv6 op een systeem of in een container waar het is uitgeschakeld.
Het adres en de poort zijn al in gebruik: een ander proces luistert op die poort, of de vorige verbinding staat nog in TIME_WAIT. Zoek het proces met ss -ltnp of lsof -i :POORT, of gebruik SO_REUSEADDR.
Het gevraagde adres kan niet worden toegewezen: het IP-adres hoort bij geen enkele interface van de machine, of de efemere poorten voor uitgaande verbindingen zijn uitgeput.
De netwerkinterface is niet actief.
Het doelnetwerk is onbereikbaar omdat er geen route naartoe is. Controleer de routetabel en de gateway; het gebeurt ook bij verbinden via IPv6 zonder IPv6-connectiviteit.
Het netwerk heeft de verbinding gereset, bijvoorbeeld wanneer een keepalive mislukt.
De verbinding werd aan de lokale kant afgebroken, bijvoorbeeld omdat de client haar sloot voordat de server haar met accept accepteerde.
De andere kant heeft de verbinding abrupt verbroken met een RST („Connection reset by peer”): het externe proces is afgesloten, een firewall of load balancer heeft de inactieve verbinding verbroken, of er werden gegevens verzonden die de andere kant niet verwachtte.
Er is geen bufferruimte beschikbaar in de kernel voor de netwerkbewerking; dit komt meestal voor bij veel verkeer of met volle socketwachtrijen.
De socket is al verbonden.
De socket is niet verbonden: er werd geprobeerd te verzenden of te ontvangen voordat er verbinding was, of de verbinding is al gesloten. Bij een FUSE-mount verschijnt dit als „Transport endpoint is not connected” wanneer het proces ervan is gestorven; je lost het op door te ontkoppelen met fusermount -u.
Er kan niet meer worden verzonden nadat die richting van de socket met shutdown is gesloten.
Te veel verwijzingen; in Linux bij het doorgeven van te veel geneste descriptors via een Unix-socket.
De time-out van de verbinding is verlopen omdat de bestemming niet antwoordde. Meestal komt dit door een firewall die de pakketten stilletjes weggooit, een host die uitstaat of een route die niet aankomt.
De bestemming weigerde de verbinding: de machine antwoordt, maar niemand luistert op die poort of een firewall antwoordt met een weigering. Controleer of de dienst draait en luistert op de juiste interface, niet alleen op 127.0.0.1.
De doelhost is offline.
Er is geen route naar de host: hij reageert niet op ARP in het lokale netwerk, of een router of firewall meldt dat hij onbereikbaar is.
Er loopt al een bewerking op de socket, zoals een niet-blokkerende connect die nog niet klaar is.
De bewerking is bezig: een niet-blokkerende connect is gestart en wordt later afgerond. Het is geen fout; wacht met poll of select.
De bestandshandle is verouderd: bij NFS is het bestand of de map op de server verwijderd of vervangen. Je lost het op door het pad opnieuw te openen of opnieuw te mounten.
De structuur moet worden opgeschoond: het bestandssysteem heeft corruptie gedetecteerd (bij ext4 en XFS met de alias EFSCORRUPTED). Ontkoppel het en voer fsck of xfs_repair uit.
Zelfde waarde:EFSCORRUPTED
Geen benoemd XENIX-bestand. Een ongebruikte verouderde code.
Er zijn geen XENIX-semaforen beschikbaar. Een ongebruikte verouderde code.
Is een benoemd XENIX-bestand. Een ongebruikte verouderde code.
Externe I/O-fout, bijvoorbeeld van een I2C-apparaat of van een externe schijf die niet antwoordde.
Het schijfquotum van de gebruiker of de groep is overschreden.
Er zit geen medium in het apparaat, zoals een station zonder schijf of een lege kaartlezer.
Het type medium is onjuist.
De bewerking werd geannuleerd, bijvoorbeeld een asynchrone I/O of een wachtbewerking van io_uring.
De benodigde sleutel staat niet in de keyring van de kernel. Verschijnt bij versleutelde bestandssystemen, zoals fscrypt of eCryptfs, als de sleutel niet is geladen.
De sleutel is verlopen. PAM en Kerberos gebruiken dit ook als het wachtwoord of het ticket is verlopen.
De sleutel is ingetrokken.
De dienst heeft de sleutel geweigerd.
De eigenaar van een robuuste mutex is gestorven zonder hem vrij te geven. De nieuwe eigenaar moet de beschermde toestand consistent maken en pthread_mutex_consistent aanroepen.
De toestand die door een robuuste mutex wordt beschermd, kan niet worden hersteld, omdat de vorige eigenaar is gestorven en niemand hem als consistent heeft gemarkeerd.
De bewerking is niet mogelijk omdat de wifi- of Bluetooth-radio door RF-kill is geblokkeerd. Controleer rfkill list, de fysieke schakelaar of de toets voor de vliegtuigmodus.
De geheugenpagina heeft een hardwarefout en de kernel heeft haar als vergiftigd gemarkeerd.
Het bestandstype is niet geschikt voor de bewerking. In macOS en BSD bestaat dit al lang; in Linux is het pas onlangs toegevoegd.
Te veel processen. BSD definieert dit voor de proceslimiet, al geeft fork in de praktijk EAGAIN terug.
De RPC-structuur is onjuist (Sun RPC, dat NFS gebruikt).
De RPC-versie komt niet overeen (Sun RPC, dat NFS gebruikt).
Het RPC-programma is niet beschikbaar op de server.
De versie van het RPC-programma komt niet overeen.
De procedure bestaat niet in het RPC-programma.
Authenticatiefout, bijvoorbeeld bij het mounten van een NFS-share.
Voor de bewerking is een authenticator nodig.
Het apparaat staat uit.
Apparaatfout, bijvoorbeeld een printer zonder papier.
Het uitvoerbare bestand is ongeldig.
Het uitvoerbare bestand is voor een ander type CPU, zoals een binary die alleen x86_64 bevat op een Mac met Apple Silicon zonder Rosetta 2, of een ARM-binary op een Mac met Intel.
De versie van de gedeelde bibliotheek komt niet overeen.
Het Mach-O-bestand is misvormd of beschadigd.
Het uitgebreide attribuut bestaat niet; komt overeen met ENODATA in Linux. Verschijnt bij xattr, bijvoorbeeld bij het verwijderen van com.apple.quarantine van een bestand dat het niet heeft.
Er is geen beleid met die naam geregistreerd in het MAC Framework.
De uitvoerwachtrij van de netwerkinterface is vol.
Onvoldoende capabilities: aanroepen die een sandbox beperkt, geven dit terug.
De terminal die het proces aanstuurde, is gesloten of de SSH-sessie is verbroken. Veel daemons, zoals nginx, sshd of rsyslog, gebruiken het als verzoek om de configuratie opnieuw te lezen; nohup, tmux en screen voorkomen dat het de processen afsluit bij het uitloggen.
Onderbreking vanaf het toetsenbord met Ctrl+C. Het programma kan het afvangen om netjes af te sluiten. Exitcode 130.
Afsluiten vanaf het toetsenbord met Ctrl+\. Beëindigt het proces met een core dump; de JVM gebruikt het daarentegen om de toestand van de threads af te drukken.
De processor kwam een ongeldige instructie tegen: een binary die is gecompileerd voor een nieuwere CPU (bijvoorbeeld met AVX2 of AVX-512 op een processor die die niet heeft), beschadigde code of een sprong naar gegevens.
Debugtrap: debuggers gebruiken het voor breakpoints. Komt het binnen zonder debugger, dan is het meestal een fout die het programma zelf heeft gedetecteerd, zoals de controles van Swift in macOS.
Het proces heeft abort() aangeroepen: een mislukte assertion, een niet-afgevangen C++-exceptie of een heapcorruptie die de C-bibliotheek heeft gedetecteerd („double free or corruption”). Exitcode 134.
Zelfde waarde:SIGIOT
Busfout: een toegang tot onjuist uitgelijnd geheugen op sommige architecturen, of tot een deel van een met mmap gekoppeld bestand dat niet meer bestaat omdat het bestand is ingekort. Gebeurt ook als /dev/shm vol raakt.
Rekenkundige uitzondering. Ondanks de naam is de meest voorkomende oorzaak een gehele deling door nul.
Beëindigt het proces onmiddellijk: het kan niet worden afgevangen, geblokkeerd of genegeerd. Het wordt verzonden door kill -9, door de OOM killer van de kernel als het geheugen op is, en door Docker of Kubernetes als een container zijn geheugenlimiet overschrijdt (OOMKilled) of na SIGTERM niet op tijd stopt. Exitcode 137.
Vrij signaal dat elke applicatie naar eigen inzicht kan gebruiken; dd meldt er bijvoorbeeld zijn voortgang mee en nginx opent er de logs opnieuw mee.
Segmentatiefout („Segmentation fault”): een toegang tot ongeldig geheugen, zoals het dereferencen van een null-pointer, buiten een array lezen of schrijven of de stack laten overlopen met een oneindige recursie. Exitcode 139.
Tweede vrije signaal dat elke applicatie naar eigen inzicht kan gebruiken.
Schrijven naar een pipe of een socket zonder lezer. Normaal bij cmd | head, waar de lezer eerder stopt; servers negeren het meestal en handelen de fout EPIPE af. Exitcode 141.
De met alarm of setitimer ingestelde timer is verlopen.
Verzoek om netjes af te sluiten. Het is het standaardsignaal van kill, systemctl stop, docker stop en van Kubernetes bij het verwijderen van een pod; het proces hoort zijn verbindingen te sluiten en te stoppen. Exitcode 143.
Stackfout van de coprocessor. Wordt in het huidige Linux niet gebruikt.
Een kindproces is beëindigd, gepauzeerd of hervat. De ouder moet het met wait opruimen; doet hij dat niet, dan blijft het kind achter als zombie.
Zelfde waarde:SIGCLD
Hervat een gepauzeerd proces, zoals fg en bg in de shell doen.
Pauzeert het proces; het kan niet worden afgevangen of genegeerd. Het wordt hervat met SIGCONT.
Pauzeren vanaf de terminal met Ctrl+Z. Anders dan SIGSTOP kan het programma het afvangen.
Een achtergrondproces probeerde van de terminal te lezen.
Een achtergrondproces probeerde naar de terminal te schrijven terwijl stty tostop actief is, of de configuratie ervan te wijzigen.
Er zijn urgente gegevens (out-of-band) op een socket binnengekomen. Go gebruikt het intern om goroutines te onderbreken.
De CPU-tijdlimiet van het proces is overschreden (ulimit -t).
De maximale bestandsgrootte die het proces mag gebruiken, is overschreden (ulimit -f).
De virtuele timer is verlopen, die alleen de CPU-tijd van het proces telt.
De profileringstimer is verlopen, die door profilers wordt gebruikt.
De grootte van het terminalvenster is gewijzigd; programma's op volledig scherm gebruiken het om zich opnieuw te tekenen.
Er is I/O beschikbaar op een descriptor die met O_ASYNC is ingesteld. In Linux is SIGPOLL hetzelfde signaal.
Zelfde waarde:SIGPOLL
Stroomstoring, die UPS-software aan het init-systeem meldt.
Ongeldige systeemaanroep. Tegenwoordig is de gebruikelijke oorzaak een seccomp-filter die hem blokkeert, zoals in containers.
Emulatortrap (EMT). Bestaat in macOS en BSD, maar niet in Linux op x86 of ARM.
Verzoek om informatie met Ctrl+T in de terminal van macOS en BSD; veel opdrachten reageren door hun voortgang te tonen.
De opdracht is goed afgerond. Het is de enige code die succes betekent: elke andere waarde duidt op een fout.
Algemene fout; elk programma bepaalt zelf wat hij betekent. De details staan meestal in wat de opdracht naar stderr schreef. grep en diff gebruiken hem met een andere betekenis: „geen overeenkomsten gevonden” of „de bestanden verschillen”.
Onjuist gebruik van een ingebouwde shellopdracht of een syntaxfout in het script. Veel programma's gebruiken hem ook voor ongeldige opties, en grep voor echte fouten.
De opdracht is verkeerd gebruikt: er ontbreken argumenten, er zijn er te veel of een optie is onjuist.
De invoergegevens hebben een onjuist formaat.
Een invoerbestand bestaat niet of kan niet worden gelezen.
De opgegeven gebruiker bestaat niet; vooral gebruikt door mailprogramma's.
De hostnaam bestaat niet.
Een benodigde dienst is niet beschikbaar, of er is iets mislukt dat in geen andere categorie past.
Interne fout van het programma.
Fout van het besturingssysteem, zoals niet kunnen forken of geen pipe kunnen maken.
Een systeembestand, zoals /etc/passwd, ontbreekt of bevat een fout.
Een uitvoerbestand kan niet worden gemaakt.
Invoer-/uitvoerfout bij het lezen of schrijven van een bestand.
Tijdelijke fout: het is zinvol het later opnieuw te proberen. Mailservers gebruiken hem om het bericht in de wachtrij te houden.
Het externe systeem antwoordde iets wat niet aan het protocol voldoet.
Onvoldoende rechten voor de bewerking.
Er zit een fout in de configuratie.
De opdracht timeout heeft hem beëindigd omdat hij de opgegeven tijd overschreed.
docker run zelf is mislukt voordat de container werd uitgevoerd, bijvoorbeeld door een onjuiste optie of een fout van de daemon. GNU timeout geeft hem ook terug als timeout zelf faalt.
Het bestand bestaat, maar kan niet worden uitgevoerd: het uitvoerrecht ontbreekt, het is een map of het is een binary voor een andere architectuur. Bij Docker is de opdracht van de container niet uitvoerbaar.
De opdracht is niet gevonden: hij is niet geïnstalleerd, staat niet in het PATH of is verkeerd gespeld. In scripts verschijnt deze code ook als de interpreter uit de #!-regel ontbreekt; bij Docker als de opdracht van de container niet in de image bestaat.
Codes boven 128 geven aan dat een signaal het proces heeft beëindigd, maar 128 komt met geen enkel signaal overeen. Git gebruikt hem voor al zijn fatale fouten („fatal: …”), zoals een repository die niet bestaat of een mislukte authenticatie bij het klonen.
De exitcode viel buiten het bereik: exit -1 komt aan als 255, omdat alleen 8 bits bewaard blijven. ssh geeft hem ook terug als de verbinding of de authenticatie mislukt, om hem te onderscheiden van de code van de externe opdracht.
De waarden voor Linux zijn die van x86, x86-64 en ARM; Alpha, MIPS, SPARC en PA-RISC nummeren sommige errno-codes en signalen anders. De Engelse berichten zijn die welke strerror en strsignal in glibc tonen, en die van macOS als ze verschillen. Exitcodes boven 128 worden geïnterpreteerd als 128 plus het signaalnummer, volgens de conventie van bash, Docker en Kubernetes.
Hoe het werkt
Als een systeemaanroep in Linux mislukt, geeft hij -1 terug en zet hij in de variabele errno een getal dat aangeeft waarom: 2 is ENOENT, het bestand bestaat niet; 13 is EACCES, toegang geweigerd. strerror zet dat getal om in de tekst die je op het scherm ziet, zoals „No such file or directory”. Python toont het als [Errno 13], Node.js als code: 'ECONNREFUSED' en Go, Rust of Java met dezelfde tekst. De nummers 1 tot en met 34 komen uit de oorspronkelijke Unix en zijn op alle systemen gelijk; de volgende heeft elk systeem op zijn eigen manier genummerd, dus ECONNREFUSED is 111 in Linux en 61 in macOS. De naam is portabel; het nummer niet.
Signalen zijn meldingen die de kernel of een ander proces naar een proces stuurt: SIGINT als je op Ctrl+C drukt, SIGTERM om het te vragen te stoppen, SIGKILL om het zonder vragen te beëindigen, SIGSEGV als het ongeldig geheugen benadert. Elk signaal heeft een standaardactie, en bijna alle kunnen worden afgevangen om iets anders te doen. Als een signaal een proces beëindigt, meldt de shell als exitcode 128 plus het signaalnummer: 137 is SIGKILL (9), 139 is SIGSEGV (11) en 143 is SIGTERM (15). Docker en Kubernetes gebruiken dezelfde conventie.
De exitcode is het getal dat een programma achterlaat als het stopt: 0 betekent succes en elke andere waarde een fout. Er blijven maar 8 bits bewaard, dus loopt hij van 0 tot 255. Er zijn weinig conventies: 126 en 127 gebruikt de shell als hij de opdracht niet kan uitvoeren of niet vindt, 64 tot en met 78 worden gedefinieerd in sysexits.h van BSD, en de rest bepaalt elk programma zelf, zoals grep, dat 1 teruggeeft als het niets vindt.
Voorbeelden
Last State: Terminated · Reason: OOMKilled · Exit Code: 137137 = 128 + 9 · SIGKILLDe container heeft zijn geheugenlimiet overschreden en de kernel heeft hem met SIGKILL beëindigd. Je moet de limiet in resources.limits.memory verhogen of uitzoeken waarom het proces zoveel verbruikt; opnieuw starten lost het niet op.Error: connect ECONNREFUSED 127.0.0.1:5432ECONNREFUSED · Linux 111 · macOS 61 · Connection refusedNode.js kon geen verbinding maken met PostgreSQL omdat niemand op poort 5432 luistert. Als de applicatie in een container draait, is 127.0.0.1 de container zelf en niet de host: gebruik de naam van de databasedienst.OSError: [Errno 48] Address already in useEADDRINUSE · Linux 98 · macOS 48De 48 verraadt dat het programma op macOS draait: in Linux is dezelfde fout 98. In beide gevallen gebruikt een ander proces de poort al; lsof -i :POORT laat zien welk.Gebruiksscenario's
- Een fout begrijpen van een applicatie in Python, Node.js, Go of C die alleen het nummer of de naam van de errno toont.
- Aan de hand van de exitcode uitzoeken waarom een Docker-container is gestopt of een Kubernetes-pod opnieuw start.
- Een errno-nummer van macOS omzetten naar de juiste naam, want vanaf 35 komt het niet overeen met dat van Linux.
- De exitcode interpreteren van een script, een cronjob of een CI-job die is mislukt.
- Kiezen welk signaal je met kill stuurt en weten wat het proces doet als het dat niet afvangt.
- Een portabele foutafhandeling schrijven die op naam vergelijkt in plaats van op nummer.
Veelgestelde vragen
Wat betekent exitcode 137?
Dat het proces is beëindigd door signaal 9, SIGKILL (128 + 9). De meest voorkomende oorzaak is geheugen: de container heeft zijn limiet overschreden, wat Kubernetes meldt als OOMKilled, of de OOM killer van de kernel heeft dat proces gekozen, wat in dmesg verschijnt als „Out of memory: Killed process”. Het gebeurt ook bij docker kill, of als het proces na SIGTERM niet binnen de termijn stopt: 10 seconden bij docker stop en 30 bij Kubernetes.
Wat is het verschil tussen SIGTERM en SIGKILL?
SIGTERM vraagt het proces om te stoppen, en het proces kan het afvangen om verbindingen te sluiten, gegevens op te slaan en af te sluiten. Bij SIGKILL beëindigt de kernel het proces meteen, zonder dat het nog iets kan doen. De juiste aanpak is SIGTERM sturen, een paar seconden wachten en alleen naar SIGKILL grijpen als het nog draait; dat is precies wat systemd, docker stop en Kubernetes doen.
Waarom heeft dezelfde errno in macOS een ander nummer?
Omdat POSIX de namen definieert, maar niet de nummers. De nummers 1 tot en met 34 hebben alle systemen geërfd van de oorspronkelijke Unix; daarna hebben BSD, waar macOS van afstamt, en System V, dat Linux volgde, ze elk apart genummerd. Vergelijk daarom altijd op naam, met errno.ECONNREFUSED in Python, err.code in Node.js of de constante in C, en niet op nummer.
Wat is het verschil tussen EACCES en EPERM?
EACCES („Permission denied”) betekent dat de rechten van het bestand of van een map in het pad het niet toestaan, of dat een ACL of SELinux het verhindert: je lost het op met chmod, chown of het betreffende beleid. EPERM („Operation not permitted”) betekent dat de bewerking zelf rechten vereist, ongeacht de bestandsrechten, zoals de eigenaar van een bestand wijzigen of een proces van een andere gebruiker beëindigen: je hebt root of een capability nodig, of je moet een attribuut verwijderen, zoals dat van onveranderbaarheid.
Hoe zie ik de exitcode van een opdracht of een container?
In bash en zsh toont echo $? die van de laatste opdracht; in PowerShell $LASTEXITCODE. In Docker toont docker ps -a hem in de kolom STATUS, zoals „Exited (137)”. In Kubernetes toont kubectl describe pod hem bij „Last State: Terminated”, samen met de reden, zoals OOMKilled of Error.