Hatte/habe hier auf einem SLES8 ein Problem mit mandb, das ja üblicherweise in der daily.cron aufgerufen wird.
Es wurde folgende Fehlermeldung perl Mail geschickt:
Irgendwas mit mandb funktioniert nicht.
Habe dann also root und man User mandb –cd in der Konsole aufgerufen und es kamen tatsächlich jede Menge Fehler in der Art: :
Zu viele offene Dateien? Das kann eigentlich nicht sein:
Ein cat /proc/sys/fs/file-max gibt 104032 an.
Warum sollte mandb so viele Dateien öffnen? Vielleicht nur falsche Fehlermeldung?
Habe deshalb das ganze noch mal mit strace begutachtet:
Es ist tatsächlich so. mandb schließt nicht immer alle Dateien manchmal schon und nach 1023 ist Schluss.
Habe dann mit ulimit -n 8128 einfach mal den bash Wert höher gesetzt und schon funktioniert der Durchlauf von mandb.
In einer neuen Bash steht der Wert übrigens auf 7168.
Nun meine abschließenden Fragen:
Warum schließt mandb nicht nach jeder geöffneten Datei?
Warum sind bei ca. 1023 (10 Bit) geöffneten Dateien Schluss?
Warum hatte dann ulimit einen Einfluss darauf?
Und am wichtigsten, wie kriege ich das jetzt am sinnvollsten im Cron unter, der auch ein YOU übersteht?
Q&D Lösung ist ja im Skript do_mandb einfach ulimit –u zu setzten.
Ach, jetzt habe ich es selbst gefunden oder?
Einfach in die Datei /etc/sysconfig/cron ulimit -n 8128 reinsetzten.
Es wurde folgende Fehlermeldung perl Mail geschickt:
Code:
Subject:cronjob@lhg24tmp - daily – FAILURE
running daily cronjob scripts
SCRIPT: clean_catman, OK.
SCRIPT: clean_core, OK.
SCRIPT: do_mandb, OK.
SCRIPT: output (stdout && stderr) follows
There seem to be trouble with mandb.
please run /usr/bin/mandb an check the output...
SCRIPT: do_mandb
------- END OF OUTPUT
SCRIPT: logrotate exited with RETURNCODE = 1.
SCRIPT: output (stdout && stderr) follows
error: error reading top line of /var/lib/logrotate.status
SCRIPT: logrotate
------- END OF OUTPUT
SCRIPT: medusa.cron, OK.
SCRIPT: suse.de-backup-rc.config, OK.
SCRIPT: suse.de-backup-rpmdb, OK.
SCRIPT: suse.de-check-battery, OK.
SCRIPT: suse.de-clean-tmp, OK.
SCRIPT: suse.de-clean-vi, OK.
SCRIPT: suse.de-cron-local, OK.
SCRIPT: updatedb, OK.
Irgendwas mit mandb funktioniert nicht.
Habe dann also root und man User mandb –cd in der Konsole aufgerufen und es kamen tatsächlich jede Menge Fehler in der Art: :
Code:
ult_src: File /usr/share/man/man1/ci.1.gz in mantree /usr/share/man
++priv_drop_count = 1
--priv_drop_count = 0
mandb: can't open /usr/share/man/man1/ci.1.gz: Too many open files
mandb: warning: /usr/share/man/man1/ci.1.gz: bad symlink or ROFF `.so' request
Zu viele offene Dateien? Das kann eigentlich nicht sein:
Ein cat /proc/sys/fs/file-max gibt 104032 an.
Warum sollte mandb so viele Dateien öffnen? Vielleicht nur falsche Fehlermeldung?
Habe deshalb das ganze noch mal mit strace begutachtet:
Code:
open("/usr/share/man/man1/setmetamode.1.gz", O_RDONLY) = 1023
fstat64(1023, {st_mode=S_IFREG|0644, st_size=558, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40596000
read(1023, "\37\213\10\10/\\\255=\2\3setmetamode.1\0eS]o\3320\24}"..., 16384) = 558
read(1023, "", 12288) = 0
_llseek(1023, 0, [558], SEEK_CUR) = 0
read(1023, "", 16384) = 0
lseek(4, 64418, SEEK_SET) = 64418
write(4, "setmetamode\0", 12) = 12
write(4, "1\t1\t1034771503\tA\t-\t-\tgz\tdefine t"..., 62) = 62
lseek(4, 135168, SEEK_SET) = 135168
write(4, "\4\0\0\0\"\0\0\0\336_\0\0\"\0\0\0007e\0\0\24\4\0\0\354"..., 4096) = 4096
lseek(4, 64418, SEEK_SET) = 64418
.
.
.
lstat64("/usr/share/man/man1/ci.1.gz", {st_mode=S_IFREG|0644, st_size=7743, ...}) = 0
stat64("/usr/share/man/man1/ci.1.gz", {st_mode=S_IFREG|0644, st_size=7743, ...}) = 0
open("/usr/share/man/man1/ci.1.gz", O_RDONLY) = -1 EMFILE (Too many open files)
write(2, "mandb: ", 7) = 7
write(2, "can\'t open /usr/share/man/man1/c"..., 38) = 38
write(2, ": Too many open files", 21) = 21
write(2, "\n", 1) = 1
write(2, "mandb: ", 7) = 7
write(2, "warning: /usr/share/man/man1/ci."..., 71) = 71
write(2, "\n", 1) = 1
Es ist tatsächlich so. mandb schließt nicht immer alle Dateien manchmal schon und nach 1023 ist Schluss.
Habe dann mit ulimit -n 8128 einfach mal den bash Wert höher gesetzt und schon funktioniert der Durchlauf von mandb.
In einer neuen Bash steht der Wert übrigens auf 7168.
Nun meine abschließenden Fragen:
Warum schließt mandb nicht nach jeder geöffneten Datei?
Warum sind bei ca. 1023 (10 Bit) geöffneten Dateien Schluss?
Warum hatte dann ulimit einen Einfluss darauf?
Und am wichtigsten, wie kriege ich das jetzt am sinnvollsten im Cron unter, der auch ein YOU übersteht?
Q&D Lösung ist ja im Skript do_mandb einfach ulimit –u zu setzten.
Ach, jetzt habe ich es selbst gefunden oder?
Einfach in die Datei /etc/sysconfig/cron ulimit -n 8128 reinsetzten.