Ошибка «Нет дочерних процессов» в Perl - PullRequest
3 голосов
/ 09 апреля 2011

У меня есть Perl-скрипт, который вызывает sqlldr и загружает данные в таблицу из плоского файла.

Теперь моя проблема в том, что хотя sqlldr загружает таблицу нормально, он возвращает код выхода как -1 (получил с помощью $?), когда я пытался использовать $!, он говорит No child processes.

Я выполняю этот сценарий с помощью команды sudo

sudo -u <uname> bash
<script_name>.pl

Этот сценарий Perl работает нормально, если я выполняю его непосредственно из моего идентификатора пользователя.Я действительно не понимаю, почему эта ошибка появляется только при выполнении через пользователя sudo.

Пожалуйста, помогите мне понять эту ошибку.

РЕДАКТИРОВАТЬ: Это работает нормально, если я дам $SIG{CHLD} = 'DEFAULT';в моем коде.Но если я уберу этот шаг, проблема снова появится.Я получил этот код от WWW, когда я просматривал эту ошибку.Есть идеи, что он делает?

1 Ответ

1 голос
/ 10 июня 2011

На большинстве платформ Unix сигнал CHLD (иногда также известный как CLD) имеет особое поведение по отношению к значению 'IGNORE'. Установка $SIG{CHLD} на 'IGNORE' на такой платформе приводит к тому, что зомби-процессы не создаются, когда родительскому процессу не удается wait() на его дочерних процессах (то есть, дочерние процессы автоматически собираются). Вызов wait() с $SIG{CHLD}, установленным на 'IGNORE', обычно возвращает -1 на таких платформах.
Извлечено из http://perl.active -venture.com / pod / perlipc-signal.html

В основном происходит то, что где-то сигнал CHLD был установлен на IGNORE , вероятно, sqlldr . Когда вы пытаетесь проверить состояние дочернего процесса, вы получаете -1, который иногда называют ECHILD. Это происходит потому, что информация о состоянии завершения дочернего процесса была отброшена из-за игнорирования сигнала CHLD. Установив $SIG{CHLD} = 'DEFAULT';, вы указываете, что сигнал CHLD должен обрабатываться обработчиком DEFAULT, а не игнорироваться.

Я не знаю, почему сигнал CHLD игнорируется, когда скрипт выполняется от пользователя sudo, а не от вашего ID пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...