perl 系统 () 退出代码 36096

perl system() exit code 36096

我试图从以下对 ksh 脚本的 system() 调用中找出退出代码 36096 的含义。

$proc_ret = system("/path/to/shellscript.sh"); 

$proc_ret returns "36096"

我检查了 shellscript.sh 的输出,它 运行 正常,直到 shellscript.sh 中的另一个 shell 脚本 (status.sh) 被调用。 只有该脚本的第一行被调用,脚本的其余部分没有被调用。

这里是status.sh

的内容
echo "a" > /tmp/a
echo "complete."
echo "b" >> /tmp/a
cat /path/to/mail.txt | mail -s "subject" email@domain
echo "mail complete."
echo "c" >> /tmp/a

我不知道为什么脚本在第一行之后没有继续。对 shellscript.sh 进行的系统调用的退出代码对我来说看起来很奇怪。 如果有人知道36096的意思,请告诉我。

请注意,36096 是 141 * 256。正如 system 文档告诉您的那样,141 是程序的退出状态。再次注意,shell 的退出状态 >128 通常意味着子进程因信号而被终止。该信号是通过从退出状态中减去 128 获得的(即查看低 7 位)。

因此脚本得到信号 13,即 SIGPIPE - 在没有 reader 的管道上写入。

看起来 mail 程序似乎无法启动(明白 PATH 对吗?通常 cron 作业有一个非常小的 PATH,您需要在您的类似 PATH=$(getconf PATH).)

的脚本

然后 cat 连接到一个不存在的 reader,瞧,这就是你的信号。

顺便说一句,cat 是无用的,因为 mail -s subj recipient < /path/to/mail.txt 可以避免昂贵的叉子和管道。