在几个RHEL 5.8上,我遇到了execve调用的问题。该execve的不但是失败了,得到以下错误:execve/bin/bash:h:没有这样的文件或目录
/bin/bash: h: No such file or directory
我使用它在C以下方式++代码:
::fork();
.
.
.
char achWritePipeDescriptor[8], achReadPipeDescriptor[8];
snprintf(achWritePipeDescriptor, sizeof(achWritePipeDescriptor), "%d", fWritePipeDescriptor);
snprintf(achReadPipeDescriptor, sizeof(achReadPipeDescriptor), "%d", fReadPipeDescriptor);
// fWritePipeDescriptor and fReadPipeDescriptor are integers
::execl("/bin/sh", "/bin/sh", "Launcher.sh", achWritePipeDescriptor, achReadPipeDescriptor, (char*)0);
switch(errno)
{
default:
printf("\n Failed to launch Launcher.sh\n");
break;
}
这里的exec调用不会失败,但我上面得到尝试与上述script.sh交互时出错。在strace的输出这一过程看起来像以下:
execve("/bin/bash", ["/bin/bash", "h", "10", "6"], [/* 36 vars */]) = 0
.
.
.
open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
fstat(2, 0x7fff23708910) = -1 EBADF (Bad file descriptor)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b9d1c785000
write(2, "/bin/bash: h: No such file or di"..., 40) = -1 EBADF (Bad file descriptor)
exit_group(127) = ?
Process 13030 detached
没有文件的“H”在这里被引用,但脚本名的最后一个字符为“H”。另外,我试图执行的脚本确实存在于预期的位置,并且具有足够的权限。
我不知道“h”是从哪里来的。
我改变了我的execve调用以下:
::execl("Launcher.sh", "Launcher.sh", achWritePipeDescriptor, achReadPipeDescriptor,(char*)0);
有了这个,它工作正常,但向下下面的代码,我看到类似的错误再execl的电话。第二个exec的区别在于二进制文件不同,但错误保持不变。
我不确定,如果这是服务器特定的问题。
任何线索,任何故障排除步骤都会有很大的帮助。
我不好,我早就应该提到它了,<script.sh>
是一个占位符。我试图说明一个shell脚本是我正在尝试执行的。 另外,writefd
和readfd
在这里是char*
。在我粘贴在这里的strace输出中可以清楚地看到它。同样,执行官也没有失败,因为我没有看到“无法启动Launcher.sh”消息。
由于您隐藏了所有重要的信息 - 这就是您的伪值“” - 对我们来说,无法提供太多帮助。在执行exec之前,应该打印这些值。当你得到有趣的结果时,打印出值。有可能,'strace'说的是实话,而shell正在被要求执行一个它找不到的脚本'h'。你的'switch(errno)case default:printf(“...”);'code is cizarre;有效(有点)但奇怪。如果'execl()'返回,则失败。你不需要测试任何东西;只需报告错误(到“stderr”或“cerr”)。 –
@Jonathan,对于这些信息,我在其他RHEL服务器上提到的exec调用完全正常。只有几个RHEL在同一件事情上失败。我编辑了我的帖子以指示值。我已经从实际文章中发布了示例。 – user1787572
我的意思是在之前的评论中没有发布实际的代码相信我,我已经完成了练习,以确定传递给exec调用的值是否正确,以及脚本的权限和位置等所有基本事项是否正确。它是确定特定RHEL服务器上出现错误的问题。对于您的信息,是Launcher.sh。还纠正了开关(errno)中的语法错误。发布这个问题时就是这么想的。让我知道,如果我错过了从故障排除的角度来看很重要的任何信息,我会提供它。 –
user1787572