So sieht die Meldung aus
$ rm /var/spool/app/cache/*.tmp
-bash: /usr/bin/rm: Argument list too longHäufige Ursachen
- Ein Verzeichnis enthält sehr viele Dateien (Cache, Sessions, Mail-Queue, Uploads), und das Muster trifft alle.
- Das Limit
ARG_MAXfür Argumente plus Umgebung eines Programmaufrufs ist überschritten. - Sehr lange Dateinamen lassen die Gesamtgröße schon mit weniger Dateien an das Limit stoßen.
- Eine große Umgebung (viele oder große Variablen) lässt weniger Platz für die Argumente.
Prüfen
- Wie hoch ist das Limit auf diesem System?
getconf ARG_MAX - Wie viele Einträge hat das Verzeichnis? (ls -f sortiert nicht, ist also schnell)
ls -f /var/spool/app/cache | wc -l - Was würde das Muster treffen? Erst anzeigen, noch nicht löschen
find /var/spool/app/cache -maxdepth 1 -type f -name '*.tmp' -print | head -n 20 - Stack-Limit, auf dem das Argument-Limit beruht
ulimit -s
Lösung
- Lass
findstatt der Shell das Muster auflösen. Erst das Ergebnis mit-printansehen, dann löschen:find /var/spool/app/cache -maxdepth 1 -type f -name '*.tmp' -delete. Das entfernt die Dateien endgültig. - Einen Befehl in Blöcken ausführen:
find VERZ -maxdepth 1 -type f -name '*.log' -exec gzip {} +. - Mit xargs und sicheren Namen:
find VERZ -maxdepth 1 -type f -name '*.jpg' -print0 | xargs -0 -n 500 mv -t /ziel. - Das Muster auf einen Teil der Dateien eingrenzen, z. B.
rm 2024-01-*, nur als Notlösung. - Herausfinden, warum so viele Dateien anfallen (Aufräum-Job, Session-Verwaltung, logrotate), und das beheben.
Häufige Fragen
Hilft es, ulimit -s zu erhöhen?
Es kann das Limit anheben, ist aber eine Notlösung. find -exec oder xargs funktionieren mit beliebig vielen Dateien.
Warum betrifft es rm -rf auf das Verzeichnis nicht?
Ohne * übergibt die Shell nur einen Namen. rm -rf VERZ löscht das ganze Verzeichnis, nutze es also nur, wenn wirklich alles weg soll.