我有一个Perl脚本,它调用sqlldr并将数据从平面文件加载到表中。
现在,我的问题是,即使sqlldr正好加载表,它返回退出代码为-1(通过使用$?
得到),当我尝试使用$!
时它说{{1 }}
我正在使用No child processes
命令
sudo
如果我直接从我的用户ID执行它,这个Perl脚本工作正常。我真的不明白为什么只有当我通过sudo用户执行时才出现此错误。
请帮我理解这个错误。
编辑:如果我在代码中提供sudo -u <uname> bash
<script_name>.pl
,它工作正常。但是,如果我删除此步骤,问题将再次出现。当我浏览这个错误时,我从WWW获得了这个代码。知道它的作用吗?
答案 0 :(得分:1)
在大多数Unix平台上,CHLD
(有时也称为CLD
)信号对'IGNORE'
的值有特殊行为。在这样的平台上将$SIG{CHLD}
设置为'IGNORE'
会导致当父进程在其子进程上无法wait()
(即自动获取子进程)时不创建僵尸进程。将wait()
设置为$SIG{CHLD}
时调用'IGNORE'
通常会在此类平台上返回-1
。
摘自http://perl.active-venture.com/pod/perlipc-signal.html
基本上发生的事情是CHLD
信号可能由sqlldr 设置为IGNORE
。当您尝试检查子进程的状态时,您会收到-1
,有时也称为ECHILD
。发生这种情况的原因是由于忽略了CHLD
信号,有关子进程完成状态的信息已被丢弃。通过设置$SIG{CHLD} = 'DEFAULT';
,您指示CHLD信号应由DEFAULT处理程序处理,而不是被忽略。
我不知道为什么从sudo用户执行脚本时忽略CHLD
信号而不是直接从用户ID执行。