Распространенной ошибкой :является сравнение результатов необработанного lsof
вызова с предполагаемым лимитом.
Глобальный лимит(/proc/sys/fs/file-max
)вы должны посмотреть на /proc/sys/fs/file-nr
; первое значение указывает, что используется, а последнее значение является пределом.
Ограничение OpenFile для каждого процесса, но оно может быть определено для пользователя; см. команду ulimit -Hn
для пользовательских ограничений и см. /etc/security/limits.conf
для определений. Обычно применяется с «пользователем приложения», например :«tomcat» :устанавливает ограничение в 65000 для пользователя tomcat, который будет применяться к запущенному процессу Java.
Если вы хотите проверить ограничения, применяемые к процессу, получите его PID, а затем:
cat /proc/${PID}/limits
Если вы хотите проверить, сколько файлов открыто процессом, получите его PID, а затем:
ls -1 /proc/${PID}/fd | wc -l
(примечание для ls это «минус один», не путать с «минус el»)
Если вы хотите узнать подробности с помощью lsof, но только для тех дескрипторов файлов, которые учитываются в ограничении, попробуйте эти:
lsof -p ${PID} | grep -P "^(\w+\s+){3}\d+\D+"
lsof -p ${PID} -d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt' -a
Замечание :«файлы» — это файлы / pipe / tcp-соединения / и т. д.
Обратите внимание, что иногда вам, вероятно, потребуется root или использовать sudo, чтобы получить правильный результат для команд; без привилегий иногда вы не видите ошибку, вы просто получаете меньше результатов.
Наконец, если вы хотите знать, к каким файлам в вашей файловой системе обращается процесс,посмотри на:
lsof -p ${PID} | grep / | awk '{print $9}' | sort | uniq
проблема с записью в crontab уже указывалась , но для выполнения скрипта с ожидаемой датой и временем измените расписание заданий на:
0 13 1 4 * [ "$(date +\%u)" -eq 4 ] && /path/to/my/script.sh
man -s 5 crontab
говорит:
Note: The day of a command's execution can be specified by two fields — day of month, and day of week. If both fields are restricted (i.e., aren't *), the command will be run when either field matches the current time.
Ваше указание дня равно 1st day
и Thursday
, поэтому оно выполняется в оба (, но не дважды, если 1-е также является четвергом, как в 2021 ).
Обычная работа -состоит в том, чтобы crontab запускался 1-го числа, а сценарий проверял день недели с помощью команды date
и завершал работу досрочно, кроме четверга.
Это кажется большой проблемой для сценария, который запускается только раз в семь лет.