From: Reto Schuettel Date: 2006-04-20T23:42:03+09:00 Subject: Re: Strange problem with PTY.spawn() --DNUSDXU7R7AVVM8C Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit Hi On Tue, Apr 18, 2006 at 06:15:14PM +0900, Reto Schuettel wrote: > Please tell me if you need anything else! I've found some more stuff: This we already know: | $ ruby1.8 -rpty -e 'so, si, pid = PTY.spawn("/bin/true"); ' | -e:1:in `spawn': No such file or directory - can't get Master/Slave device (Errno::ENOENT) | from -e:1 But what happens if we add something before the call to PTY.spawn() | $ ruby1.8 -rpty -e 'puts "blub"; so, si, pid = PTY.spawn("/bin/true"); ' | blub | -e:1: [BUG] rb_sys_fail(can't get Master/Slave device) - errno == 0 | ruby 1.8.4 (2005-12-24) [sparc-solaris2.8] | | Abort Oops? Different error? (Nobus patch is applied on this machine). The following message in the truss log was another thing that bothered me: | 26811: execve("/usr/lib/pt_chmod", 0xFFBEE340, 0xFFBEFAC8) | 26811: *** cannot trace across exec() of /usr/lib/pt_chmod *** Eventually I tried to run the process with user rights and then truss it with root rights: | $ ruby1.8 -rpty -e 'puts $$; readline; so, si, pid = PTY.spawn("/bin/true"); ' 19467 [ here I started a second terminal and attached a truss, which is running as root, hen I pressed enter ] | | -e:1: [BUG] rb_sys_fail(can't get Master/Slave device) - errno == 0 | ruby 1.8.4 (2005-12-24) [sparc-solaris2.8] | | Abort This root-truss covers now everything and it's attached to this email as 'pty-spawn-problem.truss'. Then I tried soemthing else, I run the whole ruby process as root: | $ sudo ruby1.8 -rpty -e 'puts $$; so, si, pid = PTY.spawn("/bin/true"); ' | 20320 Hm, this works now. So perhaps it's a permission problem. Afterwards I tried to run a command which produces output: | $ sudo ruby1.8 -rpty -e 'puts $$; so, si, pid = PTY.spawn("uptime"); puts so.read;' | 20351 No output. Lets try it with sysread: | $ sudo ruby1.8 -rpty -e 'puts $$; so, si, pid = PTY.spawn("uptime"); puts so.sysread(1024);' | 20361 | -e:1:in `sysread': end of file reached (EOFError) | from -e:1 Nothing... perhaps it has to do with the fact that uptime imediatly quits (my linux boxes produces sometimes an exception before I can read the output) | $ sudo ruby1.8 -rpty -e 'puts $$; so, si, pid = PTY.spawn("ssh testsite1"); puts so.sysread(1024);' | 20603 | -e:1:in `sysread': end of file reached (EOFError) | from -e:1 Same here.. :/ I really don't get it.. im completly out of ideas... Please tell me if you need anything else. Regards, Reto Sch�ttel --DNUSDXU7R7AVVM8C Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: attachment; filename="pty-spawn-problem.truss" 19467: read(0, 0xFF1C35EC, 1024) (sleeping...) 19467: signotifywait() (sleeping...) 19467: lwp_cond_wait(0xFF0C34E8, 0xFF0C34F8, 0xFF0BCD80) (sleeping...) 19467: door_return(0x00000000, 0, 0x00000000, 0) (sleeping...) 19467: read(0, "\n", 1024) = 1 19467: open64("/dev/ptmx", O_RDWR) = 3 19467: sigaction(SIGCLD, 0xFFBEC950, 0xFFBECA50) = 0 19467: fork1() = 19605 19605: fork1() (returning as child ...) = 19467 19467: lwp_cond_wait(0xFF0C34E8, 0xFF0C34F8, 0xFF0BCD80) = 0 19605: getpid() = 19605 [19467] 19467: lwp_mutex_wakeup(0xFF0C34F8) = 0 19467: lwp_mutex_lock(0xFF0C34F8) = 0 19605: munmap(0xFF070000, 24576) = 0 19605: munmap(0xFF080000, 24576) = 0 19605: munmap(0xFEF0E000, 1056768) = 0 19605: munmap(0xFEE0C000, 1056768) = 0 19605: munmap(0xFED0A000, 1056768) = 0 19605: munmap(0xFEC08000, 1056768) = 0 19605: munmap(0xFEB06000, 1056768) = 0 19605: munmap(0xFEA04000, 1056768) = 0 19605: munmap(0xFE902000, 1056768) = 0 19605: munmap(0xFE800000, 1056768) = 0 19605: mmap(0x00000000, 8454144, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANON, -1, 0) = 0xFE800000 19605: mprotect(0xFE800000, 8192, PROT_NONE) = 0 19605: mprotect(0xFE902000, 8192, PROT_NONE) = 0 19605: mprotect(0xFEA04000, 8192, PROT_NONE) = 0 19605: mprotect(0xFEB06000, 8192, PROT_NONE) = 0 19605: mprotect(0xFEC08000, 8192, PROT_NONE) = 0 19605: mprotect(0xFED0A000, 8192, PROT_NONE) = 0 19605: mprotect(0xFEE0C000, 8192, PROT_NONE) = 0 19605: mprotect(0xFEF0E000, 8192, PROT_NONE) = 0 19605: lwp_create(0xFFBEC6C0, __LWP_ASLWP, 0xFF00FDE4) = 2 19605: lwp_create() (returning as new lwp ...) = 0 19605: door_create(0xFF0A68D8, 0x00000000, 0x00000002) = 4 19605: lwp_schedctl(SC_STATE|SC_BLOCK, 4, 0xFFBEC8C4) = 0 19605: door_info(4, 0xFF0C29E0) = 0 19605: mmap(0x00000000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANON, -1, 0) = 0xFF080000 19605: mprotect(0xFF080000, 8192, PROT_NONE) = 0 19605: lwp_create(0xFFBEC6A8, LWP_DETACHED|LWP_SUSPENDED, 0xFF085DE4) = 3 19605: lwp_create() (returning as new lwp ...) = 0 19605: lwp_continue(3) = 0 19605: close(4) = 0 19605: lwp_schedctl(SC_STATE|SC_BLOCK, -1, 0xFF085CD4) = 0 19605: sigaction(SIGWAITING, 0xFF0BCE08, 0x00000000) = 0 19605: lwp_mutex_wakeup(0xFF0C34F8) = 0 19605: signotifywait() = 32 19605: lwp_mutex_lock(0xFF0C34F8) = 0 19605: lwp_sigredirect(0, SIGWAITING, 0x00000000) = 0 19605: lwp_mutex_wakeup(0xFF0C34F8) = 0 19605: lwp_mutex_lock(0xFF0C34F8) = 0 19605: lwp_schedctl(SC_DOOR, 0, 0x00000000) Err#22 EINVAL 19605: lwp_mutex_wakeup(0xFF0C34F8) = 0 19605: lwp_mutex_lock(0xFF0C34F8) = 0 19605: lwp_mutex_lock(0xFF0C34F8) = 0 19605: lwp_mutex_wakeup(0xFF0C34F8) = 0 19605: lwp_mutex_wakeup(0xFF0C34F8) = 0 19605: lwp_mutex_lock(0xFF0C34F8) = 0 19605: lwp_self() = 3 19605: mmap(0x00000000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANON, -1, 0) = 0xFF070000 19605: mprotect(0xFF070000, 8192, PROT_NONE) = 0 19605: lwp_create(0xFF00FAB8, LWP_DETACHED|LWP_SUSPENDED, 0xFF073DE4) = 4 19605: lwp_create() (returning as new lwp ...) = 0 19605: lwp_continue(4) = 0 19605: lwp_schedctl(SC_STATE|SC_BLOCK, -1, 0xFF073CD4) = 0 19605: signotifywait() = 32 19605: lwp_sigredirect(0, SIGWAITING, 0x00000000) = 0 19605: sigaction(SIGWAITING, 0xFF0BCE28, 0x00000000) = 0 19605: execve("/usr/lib/pt_chmod", 0xFFBEC970, 0xFFBEFAB0) argc = 2 19605: resolvepath("/usr/lib/ld.so.1", "/usr/lib/ld.so.1", 1023) = 16 19605: open("/var/ld/ld.config", O_RDONLY) Err#2 ENOENT 19605: stat("/usr/lib/libc.so.1", 0xFFBEF20C) = 0 19605: open("/usr/lib/libc.so.1", O_RDONLY) = 4 19605: fstat(4, 0xFFBEF20C) = 0 19605: mmap(0x00000000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) = 0xFF3A0000 19605: mmap(0x00000000, 802816, PROT_NONE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANON, -1, 0) = 0xFF280000 19605: mmap(0xFF280000, 702344, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0) = 0xFF280000 19605: mmap(0xFF33C000, 24772, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 704512) = 0xFF33C000 19605: munmap(0xFF32C000, 65536) = 0 19605: mmap(0x00000000, 8192, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFF390000 19605: memcntl(0xFF280000, 113528, MC_ADVISE, MADV_WILLNEED, 0, 0) = 0 19605: close(4) = 0 19605: stat("/usr/lib/libdl.so.1", 0xFFBEF20C) = 0 19605: open("/usr/lib/libdl.so.1", O_RDONLY) = 4 19605: fstat(4, 0xFFBEF20C) = 0 19605: mmap(0xFF3A0000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0) = 0xFF3A0000 19605: close(4) = 0 19605: stat("/usr/platform/SUNW,Sun-Fire-280R/lib/libc_psr.so.1", 0xFFBEEFD4) = 0 19605: open("/usr/platform/SUNW,Sun-Fire-280R/lib/libc_psr.so.1", O_RDONLY) = 4 19605: fstat(4, 0xFFBEEFD4) = 0 19605: mmap(0x00000000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) = 0xFF380000 19605: close(4) = 0 19605: brk(0x00020D30) = 0 19605: brk(0x00022D30) = 0 19605: open64("/etc/.name_service_door", O_RDONLY) Err#2 ENOENT 19605: open("/etc/nsswitch.conf", O_RDONLY) = 4 19605: brk(0x00022D30) = 0 19605: brk(0x00024D30) = 0 19605: fcntl(4, F_DUPFD, 0x00000100) = 256 19605: close(4) = 0 19605: read(256, " #\n # / e t c / n s s".., 1024) = 789 19605: read(256, 0x00022A40, 1024) = 0 19605: close(256) = 0 19605: stat("/usr/lib/nss_files.so.1", 0xFFBED124) = 0 19605: open("/usr/lib/nss_files.so.1", O_RDONLY) = 4 19605: fstat(4, 0xFFBED124) = 0 19605: mmap(0x00000000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) = 0xFF370000 19605: mmap(0x00000000, 98304, PROT_NONE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANON, -1, 0) = 0xFF350000 19605: mmap(0xFF350000, 20074, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0) = 0xFF350000 19605: mmap(0xFF366000, 1768, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 24576) = 0xFF366000 19605: munmap(0xFF356000, 65536) = 0 19605: memcntl(0xFF350000, 6904, MC_ADVISE, MADV_WILLNEED, 0, 0) = 0 19605: close(4) = 0 19605: stat("/usr/lib/libnsl.so.1", 0xFFBED064) = 0 19605: open("/usr/lib/libnsl.so.1", O_RDONLY) = 4 19605: fstat(4, 0xFFBED064) = 0 19605: mmap(0xFF370000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0) = 0xFF370000 19605: mmap(0x00000000, 712704, PROT_NONE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANON, -1, 0) = 0xFF180000 19605: mmap(0xFF180000, 579710, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0) = 0xFF180000 19605: mmap(0xFF21E000, 33168, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 581632) = 0xFF21E000 19605: mmap(0xFF228000, 23224, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANON, -1, 0) = 0xFF228000 19605: munmap(0xFF20E000, 65536) = 0 19605: memcntl(0xFF180000, 83740, MC_ADVISE, MADV_WILLNEED, 0, 0) = 0 19605: close(4) = 0 19605: stat("/usr/lib/libmp.so.2", 0xFFBED064) = 0 19605: open("/usr/lib/libmp.so.2", O_RDONLY) = 4 19605: fstat(4, 0xFFBED064) = 0 19605: mmap(0xFF370000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0) = 0xFF370000 19605: mmap(0x00000000, 90112, PROT_NONE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANON, -1, 0) = 0xFF260000 19605: mmap(0xFF260000, 11316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0) = 0xFF260000 19605: mmap(0xFF274000, 865, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 16384) = 0xFF274000 19605: munmap(0xFF264000, 65536) = 0 19605: memcntl(0xFF260000, 3124, MC_ADVISE, MADV_WILLNEED, 0, 0) = 0 19605: close(4) = 0 19605: munmap(0xFF370000, 8192) = 0 19605: brk(0x00024D30) = 0 19605: brk(0x00026D30) = 0 19605: open("/etc/group", O_RDONLY) = 4 19605: fstat64(4, 0xFFBED590) = 0 19605: brk(0x00026D30) = 0 19605: brk(0x00028D30) = 0 19605: ioctl(4, TCGETA, 0xFFBED51C) Err#25 ENOTTY 19605: read(4, " r o o t : : 0 : r o o t".., 8192) = 476 19605: llseek(4, 0xFFFFFFFFFFFFFEB4, SEEK_CUR) = 144 19605: close(4) = 0 19605: ioctl(3, I_STR, 0xFFBEF9F0) = 0 19605: fstat64(3, 0xFFBEF958) = 0 19605: access("/dev/pts/11", 0) = 0 19605: chown("/dev/pts/11", 0, 0) Err#1 EPERM 19605: llseek(0, 0, SEEK_CUR) = 283470 19605: _exit(1) 19467: waitid(P_PID, 19605, 0xFFBEC908, 0403 ) = 0 19467: close(3) = 0 19467: write(2, " - e : 1 : ", 6) = 6 19467: write(2, " [ B U G ] ", 6) = 6 19467: write(2, " r b _ s y s _ f a i l (", 12) = 12 19467: write(2, " c a n ' t g e t M a".., 29) = 29 19467: write(2, " ) - e r r n o = =".., 14) = 14 19467: write(2, "\n r u b y ", 6) = 6 19467: write(2, " 1 . 8 . 4", 5) = 5 19467: write(2, " (", 2) = 2 19467: write(2, " 2 0 0 5 - 1 2 - 2 4", 10) = 10 19467: write(2, " ) [", 3) = 3 19467: write(2, " s p a r c - s o l a r i".., 16) = 16 19467: write(2, " ]\n\n", 3) = 3 19467: sigaction(SIGABRT, 0x00000000, 0xFFBEC588) = 0 19467: llseek(0, 0, SEEK_CUR) = 283582 19467: sigaction(SIGABRT, 0xFFBEC3D8, 0xFFBEC4D8) = 0 19467: sigprocmask(SIG_SETMASK, 0xFF0C8CE0, 0xFFBEC3E0) = 0 19467: lwp_kill(1, SIGABRT) = 0 19467: sigprocmask(SIG_SETMASK, 0xFFBEC3E0, 0x00000000) = 0 19467: Received signal #6, SIGABRT [default] 19467: siginfo: SIGABRT pid=19467 uid=5006 code=-1 19467: *** process killed *** --DNUSDXU7R7AVVM8C--