错误“没有这样的设备或地址”来自child_process.exec,管道有帮助。为什么?
我正在使用 child_process.exec
执行各种被子命令并捕获其输出。除 Quilt Graph
外,这对于所有命令都可以正常工作。这会导致错误“没有此类设备或地址”。如果我从命令行运行命令,则不会发生该错误。
Quilt Graph命令是一个bash脚本,运行(略微解释)
cat $QUILT_PC/applied_patches | eval $QUILT_DIR/scripts/dependency-graph - $pipe
文件 applied_patches
包含一个补丁列表, dependency-graph
是一个perl脚本, pipe pipe
是一个空字符串或 |点-TPS
。
我注意到 child_process.exec
如果管道
实际上是一个管道,则不会失败。由于我不希望PostScript输出(这是 | dot -tps
做的),所以我附加了 | cat
child_process.exec
的参数,现在执行类似 Quilt Graph |猫
。但这显然是一个小事。
使用 child_process.exec
运行 strace/usr/bin/quilt graph
...
stat("/usr/share/quilt/compat/bash", {st_mode=S_IFREG|0755, st_size=1234376, ...}) = 0
geteuid() = 1000
getegid() = 1000
getuid() = 1000
getgid() = 1000
access("/usr/share/quilt/compat/bash", R_OK) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT TERM CHLD], [], 8) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7faa1838aa10) = 32080
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x5574b6621d30, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7faa183c8d60}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7faa183c8d60}, 8) = 0
wait4(-1, No such device or address
[{WIFEXITED(s) && WEXITSTATUS(s) == 6}], 0, NULL) = 32080
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7faa183c8d60}, {sa_handler=0x5574b6621d30, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7faa183c8d60}, 8) = 0
ioctl(2, TIOCGWINSZ, 0x7ffd8531dd60) = -1 ENOTTY (Inappropriate ioctl for device)
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=32080, si_uid=1000, si_status=6, si_utime=1, si_stime=0} ---
wait4(-1, 0x7ffd8531d6d0, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]}) = 0
read(255, "", 2938) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
exit_group(6) = ?
+++ exited with 6 +++
使用 child> child_process.exec
运行 strace> strace -f/usr /bin/quilt Graph
提供
...
[pid 23333] write(1, "./linebuffer.h\n./remotetcp.c\n", 29) = 29
[pid 23320] <... read resumed>"./linebuffer.h\n./remotetcp.c\n", 8192) = 29
[pid 23333] close(1 <unfinished ...>
[pid 23320] read(3, <unfinished ...>
[pid 23333] <... close resumed>) = 0
[pid 23333] close(2) = 0
[pid 23333] exit_group(0) = ?
[pid 23333] +++ exited with 0 +++
[pid 23332] <... wait4 resumed>[{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 23333
[pid 23332] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=23333, si_uid=1000, si_status=0, si_utime=0, si_stime=1} ---
[pid 23332] rt_sigreturn({mask=[]}) = 23333
[pid 23332] wait4(-1, 0x7ffd722fcb6c, WNOHANG, NULL) = -1 ECHILD (No child processes)
[pid 23332] exit_group(0) = ?
[pid 23332] +++ exited with 0 +++
[pid 23320] <... read resumed>"", 8192) = 0
[pid 23320] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=23332, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
[pid 23320] fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
[pid 23320] close(3) = 0
[pid 23320] wait4(23332, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 23332
[pid 23320] openat(AT_FDCWD, "/dev/stdout", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = -1 ENXIO (No such device or address)
[pid 23320] write(2, "No such device or address\n", 26No such device or address
) = 26
[pid 23320] rt_sigaction(SIGHUP, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGINT, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGQUIT, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGILL, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGTRAP, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGABRT, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGBUS, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGFPE, NULL, {sa_handler=SIG_IGN, sa_mask=[FPE], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f16699c2d60}, 8) = 0
[pid 23320] rt_sigaction(SIGKILL, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGUSR1, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGSEGV, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGUSR2, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGPIPE, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGALRM, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGTERM, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGSTKFLT, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGCHLD, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGCONT, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGSTOP, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGTSTP, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGTTIN, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGTTOU, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGURG, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGXCPU, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGXFSZ, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGVTALRM, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGPROF, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGWINCH, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGIO, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGPWR, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGSYS, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_2, NULL, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_3, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_4, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_5, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_6, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_7, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_8, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_9, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_10, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_11, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_12, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_13, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_14, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_15, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_16, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_17, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_18, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_19, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_20, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_21, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_22, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_23, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_24, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_25, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_26, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_27, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_28, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_29, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_30, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_31, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGRT_32, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGABRT, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGCHLD, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] rt_sigaction(SIGIO, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
[pid 23320] exit_group(6) = ?
[pid 23320] +++ exited with 6 +++
[pid 23319] <... wait4 resumed>[{WIFEXITED(s) && WEXITSTATUS(s) == 6}], 0, NULL) = 23320
[pid 23319] rt_sigaction(SIGINT, {sa_handler=0x55ad0f08acd0, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fc509dd6d60}, {sa_handler=0x55ad0f068d30, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fc509dd6d60}, 8) = 0
[pid 23319] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 23319] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=23320, si_uid=1000, si_status=6, si_utime=6, si_stime=9} ---
[pid 23319] wait4(-1, 0x7ffd19cbf710, WNOHANG, NULL) = -1 ECHILD (No child processes)
[pid 23319] rt_sigreturn({mask=[]}) = 0
[pid 23319] exit_group(6) = ?
[pid 23319] +++ exited with 6 +++
[pid 23299] <... wait4 resumed>[{WIFEXITED(s) && WEXITSTATUS(s) == 6}], 0, NULL) = 23319
[pid 23299] rt_sigaction(SIGINT, {sa_handler=0x55ad0f08acd0, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fc509dd6d60}, {sa_handler=0x55ad0f068d30, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fc509dd6d60}, 8) = 0
[pid 23299] ioctl(2, TIOCGWINSZ, 0x7ffd19cc00c0) = -1 ENOTTY (Inappropriate ioctl for device)
[pid 23299] rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0
[pid 23299] close(3) = -1 EBADF (Bad file descriptor)
[pid 23299] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 23299] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=23318, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
[pid 23299] wait4(-1, 0x7ffd19cbfc90, WNOHANG, NULL) = -1 ECHILD (No child processes)
[pid 23299] rt_sigreturn({mask=[]}) = 0
[pid 23299] rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
[pid 23299] rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
[pid 23299] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 23299] exit_group(6) = ?
[pid 23299] +++ exited with 6 +++
<... wait4 resumed>[{WIFEXITED(s) && WEXITSTATUS(s) == 6}], 0, NULL) = 23299
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f76a5bdbd60}, {sa_handler=0x55c3675d9d30, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f76a5bdbd60}, 8) = 0
ioctl(2, TIOCGWINSZ, 0x7ffccdbe2b00) = -1 ENOTTY (Inappropriate ioctl for device)
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=23299, si_uid=1000, si_status=6, si_utime=0, si_stime=3} ---
wait4(-1, 0x7ffccdbe2490, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]}) = 0
read(255, "", 2938) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
exit_group(6) = ?
+++ exited with 6 +++
某人可以解释是什么原因导致错误以及如何避免它?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
strace
输出的这一行是吸烟枪:现在注意这些错误
man 2 Openat
:enxio
不适用的第一个原因,因为o_nonblock
未设置。第二个原因不适用,因为Linux(不符合)将返回enodev
,如果确实如此。因此,这指出了第三个原因。让我们尝试一个简单的测试以确认该理论:运行该理论,然后使用
PS
查找孩子的PID,然后dols -l/proc/proc/pid /fd /
。您会看到FD具有1-&gt;的条目。 '套接字:[1404159]'
,它确认标准的确是Unix域插座。So the problem is created by a combination of three things:
child> child_process.exec.exec.exec
他们的标准输出
打开
或openat
unix域套接字在 :
我不确定为什么Nodejs不仅在此处使用实际管道而不是Unix域插座,而是您的
|解决方法。 CAT
可能是您最小的选项。 (从那以后这样做依赖性图形
确实具有真实的管道作为标准输出,并且cat
notdot -tps
尝试打开<<代码>/dev/stdout 喜欢它。)This line of your
strace
output is the smoking gun:Now notice these errors listed by
man 2 openat
:The first reason for
ENXIO
doesn't apply, sinceO_NONBLOCK
wasn't set. The second reason doesn't apply, since Linux would (non-compliantly) returnENODEV
instead if it did. So that points to the third reason. Let's try a simple test to confirm that theory:Run that, then look for the child's PID with
ps
, and dols -l /proc/PID/fd/
. You'll see the FDs have entries like1 -> 'socket:[1404159]'
, which confirms that standard out is indeed a UNIX domain socket.So the problem is created by a combination of three things:
$QUILT_DIR/scripts/dependency-graph
opens/dev/stdout
for writing instead of just using FD 1 directlychild_process.exec
have a UNIX domain socket as their standard outputopen
oropenat
a UNIX domain socketThis is somewhat documented under
options.stdio
:I'm not sure why nodejs doesn't just use actual pipes instead of UNIX domain sockets here, but your workaround of
| cat
might be your least-bad option. (Doing that works since thendependency-graph
does have a real pipe as standard output, and neithercat
nordot -Tps
try to open/dev/stdout
like it does.)