3

我有一个 Perl 脚本,它调用 sqlldr 并将数据从平面文件加载到表中。

现在,我的问题是,即使 sqlldr 很好地加载了表,它也将退出代码返回为 -1(通过使用获得$?),当我尝试使用$!它时说No child processes

我正在使用sudo命令执行此脚本

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

如果我直接从我的用户 ID 执行这个 Perl 脚本,它就可以正常工作。我真的不明白为什么只有当我通过 sudo 用户执行时才会出现此错误。

请帮助我理解这个错误。

编辑:如果我给出$SIG{CHLD} = 'DEFAULT';我的代码,它工作正常。但是,如果我删除这一步,问题就会再次出现。当我浏览此错误时,我从 WWW 获得了此代码。知道它有什么作用吗?

4

1 回答 1

1

在大多数 Unix 平台上,CHLD(有时也称为CLD)信号对于'IGNORE'. 在这样的平台上设置$SIG{CHLD}为当父进程在其子进程上失败时不会创建僵尸进程(即子进程被自动收割)。使用set to调用通常会在此类平台上返回。摘自http://perl.active-venture.com/pod/perlipc-signal.html'IGNORE'wait()wait()$SIG{CHLD}'IGNORE'-1

基本上正在发生的事情是某处CHLD信号已被IGNORE sqlldr 设置为可能。当您尝试检查子进程的状态时,您会收到-1有时称为ECHILD. 出现这种情况是因为忽略了CHLD信号,有关子进程完成状态的信息已被丢弃。通过设置$SIG{CHLD} = 'DEFAULT';,您表示 CHLD 信号应由 DEFAULT 处理程序处理,而不是被忽略。

我不知道为什么CHLD从 sudo 用户执行脚本而不是直接从您的用户 ID 执行脚本时忽略信号。

于 2011-06-09T22:00:10.273 回答