Некоторые сообщения об ошибках Linux не перенаправляются в файл с 2>x

У меня есть песочница, которая использует setrlimit(), чтобы ограничить размер выходного файла другой программы, запущенной под его контролем, которую я запускаю так:

sandbox -max 2048 /usr/bin/mono --debug myprogram.exe <p1 >r1 2>r2

Переключатель "-max 2048" указывает песочнице ограничивать вывод максимум 2K байтами.

Если внутри "myprogram.exe" возникает исключение или я специально пишу что-то в stderr из "myprogram.exe", оно отображается в r2, как и ожидалось. Тем не менее, когда предел размера файла превышен, я получаю это сообщение об ошибке:

File size limit exceeded (core dumped)

но вместо записи в журнал ошибок r2, как и ожидалось, он выходит на консоль. Может кто-нибудь сказать мне, почему это происходит? Можно ли как-то организовать это сообщение для записи в r2 вместе со всем остальным?

2 ответа

Решение

Это похоже на ошибку, которая будет сообщена оболочкой, а не программой. Stdout/stderr оболочки никуда не перенаправляются.

Скорее всего, это открыть другой дескриптор файла (скажем, 3), назначьте его на stderr (3>&2), а затем, хотя вы перенаправили 2>r2 дескриптор 3 все еще прикреплен к консоли. Таким образом, печатая что-то на 3 выведет на консоль. Вы можете попробовать перечислить все открытые дескрипторы на /proc/self/fd/ чтобы увидеть, если это так.

Другие вопросы по тегам