Как проверить, какой предел был превышен? (Процесс завершается из-за ulimit.)

Другая опция является передозировкой:

od -t x1 FILE

или

od -x FILE

od имеет много опций для подстройки.

11
26.10.2011, 22:18
2 ответа

Вообще говоря, я не думаю, что Вы можете, к сожалению. (Некоторые операционные системы могли бы предусмотреть его, но я не знаю о тех, я знаю поддержку этого.)

Справочный документ для пределов ресурса: getrlimit от POSIX 2008.

Возьмите, например, предел ЦП RLIMIT_CPU.

  • Если процесс превышает мягкий предел, он отправляется a SIGXCPU
  • Если процесс превышает жесткий предел, это получает плоскость SIGKILL

Если Вы можете wait() на Вашей программе Вы могли сказать, была ли она уничтожена SIGXCPU. Но Вы не могли дифференцировать a SIGKILL диспетчеризированный для нарушения жесткого предела от простого уничтожения снаружи. Кроме того, если программа обрабатывает XCPU, Вы не будете даже видеть это снаружи.

То же самое для RLIMIT_FSIZE. Вы видите SIGXFSZ от wait() состояние, если программа не обрабатывает его. Но после того как предел размера файла превышен, единственная вещь, которая происходит, состоит в том, что дальнейший ввод-вывод, который пытается протестировать тот предел снова, просто получит EFBIG - это будет обработано (или нет, к сожалению) программой внутренне. Если программа обрабатывает SIGXFSZ, то же как выше - Вы не будете знать об этом.

RLIMIT_NOFILE? Ну, Вы даже не получаете сигнал. open и друзья просто возвращаются EMFILE к программе. Это иначе не побеспокоено, таким образом, это перестанет работать (или не) в том, какой бы ни путь это было кодировано для сбоя в той ситуации.

RLIMIT_STACK? Старый добрый SIGSEGV, не может быть отличен от счета других причин стать поставленным. (Вы будете знать это, именно это уничтожил процесс хотя, от wait состояние.)

RLIMIT_AS и RLIMIT_DATA просто сделает malloc() и немногие другие начинают перестать работать (или получить SIGSEGV если предел AS поражен при попытке расширить стек на Linux). Если программа не будет очень хорошо записана, она, вероятно, перестанет работать справедливо случайным образом в той точке.

Таким образом короче говоря, обычно, отказы или не явно отличаются от других смертельных причин процесса, таким образом, Вы не можете быть уверены, или можете быть обработаны полностью из программы, в этом случае, она решает if/when/how, она продолжается, не Вы с внешней стороны.

Лучшее, которое можно сделать насколько я знаю, пишут немного кода, что ветвления программы, ожидает на нем, и:

  • проверьте статус выхода для обнаружения SIGXCPU и SIGXFSZ (AFAIK, те сигналы будут только сгенерированы ОС для предельных проблем ресурса). В зависимости от Ваших точных потребностей Вы могли принять это SIGKILL и SIGSEGV были также связаны с пределами ресурса, но это - что-то вроде фрагмента.
  • посмотрите на то, из чего можно выйти getrusage(RUSAGE_CHILDREN,...) на Вашей реализации для получения подсказки о других.

Определенные для ОС средства могли бы существовать для помощи здесь (возможно вещи как ptrace на Linux или Солярисе dtrace), или возможно методы типа отладчика, но это будет еще более связанным с Вашей определенной реализацией.


(Я надеюсь, что кто-то еще ответит некоторой волшебной вещью, о которой я полностью не знаю.)

6
27.01.2020, 19:59
  • 1
    Хорошо. Что относительно просто тех трех: (Мадам) чрезмерный предел памяти, (Время) ограничение по времени, (Допускает ошибку) другая ошибка? Я знаю о создании обертки вокруг malloc но к сожалению это не решает проблему памяти в целом, причина в целом, это о системном вызове brk (действительно ли я прав?). –  Grzegorz Wierzowiecki 26.10.2011, 22:25
  • 2
    Обертывание malloc не поможет, если Вы не будете управлять программой. Если Вы говорите о взломах как LD_PRELOADлуг это - граница для Вашего "не изменения процесса" ограничение, и это поможет немного, но не действительно - malloc, brk, sbrk и mmap перестанет работать с ENOMEM, точно, как будто Вы действительно были в низкой ситуации с памятью (но далеко ниже пределов памяти). Ограничение по времени RLIMIT_CPU, Я не знаю о тактовом стеной ограничении по времени. –  Mat 26.10.2011, 22:33
  • 3
    Спасибо за обеспечение меня о brk. Как я вижу, требование 'программа не обрабатывает сигналы X, Y, Z...', решит проблемы SIGXCPU, SIGXFSZ, SIGSEGV, благодаря waitpid (Если я буду неправ, исправьте меня). –  Grzegorz Wierzowiecki 29.10.2011, 13:30
  • 4
    SIGSEGV может быть повышен в ситуациях, которые не являются предельными нарушениями ресурса (нулевой указатель разыменовывают быть наиболее распространенной вещью, которая повышает его) - Вы не можете быть уверены, что это - хит ulimit, который вызывает его. –  Mat 29.10.2011, 13:32
  • 5
    Спасибо за обеспечение меня о brk. Как я вижу, требование 'программа не обрабатывает сигналы X, Y, Z...', решит проблемы SIGXCPU, SIGXFSZ, SIGSEGV, благодаря waitpid.Я прав? –  Grzegorz Wierzowiecki 29.10.2011, 13:46

Я в настоящее время делаю некоторую работу над той же проблемой. Я смог иметь частичное решение его. Я использовал аудит susbsystem. Можно отследить работу над [1].

[1] https://github.com/PaulDaviesC/Logging-limits.conf

3
27.01.2020, 19:59

Теги

Похожие вопросы