
복제()할 수 있는 실행 가능한 바이너리(소스화되지 않음)가 있습니다. 아무것도 인쇄하지 않고, 아이가 내가 원하는 것을 인쇄하려고 하는 것 같습니다. 하위 프로세스가 실제로 실패하더라도 항상 성공적으로 반환됩니다. 내 아이의 반품 코드를 알고 싶습니다. 프롬프트도 즉시 반환되지만 마술처럼 포크를 풀거나 하위 프로세스가 종료될 때까지 기다리는 방식으로 전경에서 실행되는 것을 원합니다.
어떡해? 그냥 리눅스.
나는 최소한 출력을 얻고 전경에 머무르는 다음과 같은 스크립트를 시도했습니다.
thecmd &
daemon="$(pgrep -P $!)"
cat "/proc/$daemon/fd/2" >&2
하지만 내가 얻기도 전에 아이는 실패하고 아무런 성과도 내지 못할 수도 있다.
데몬과 stdout을 얻으려고합니다.
cmd &
daemon="$(pgrep -P $!)"
echo "daemon: $daemon"
echo "parent's stdout:"
readlink -f "/proc/$!/fd/1"
echo "child's stdout:"
readlink -f "/proc/$daemon/fd/1"
인쇄:
daemon:
parent's stdout:
child's stdout:
strace -f
다음은 실패한 하위 프로세스의 출력 입니다 (왜 stderr이 없나요?).
23266 execve("/usr/local/sbin/tobiiusbserviced", ["/usr/local/sbin/tobiiusbserviced"], 0x7ffc21846b08 /* 17 vars */) = 0
23266 brk(NULL) = 0x2368000
23266 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
23266 openat(AT_FDCWD, "/usr/local/lib/tobiiusb/tls/haswell/x86_64/libtobii_osal.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
23266 stat("/usr/local/lib/tobiiusb/tls/haswell/x86_64", 0x7ffdbcb20d80) = -1 ENOENT (No such file or directory)
23266 openat(AT_FDCWD, "/usr/local/lib/tobiiusb/tls/haswell/libtobii_osal.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
23266 stat("/usr/local/lib/tobiiusb/tls/haswell", 0x7ffdbcb20d80) = -1 ENOENT (No such file or directory)
23266 openat(AT_FDCWD, "/usr/local/lib/tobiiusb/tls/x86_64/libtobii_osal.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
23266 stat("/usr/local/lib/tobiiusb/tls/x86_64", 0x7ffdbcb20d80) = -1 ENOENT (No such file or directory)
23266 openat(AT_FDCWD, "/usr/local/lib/tobiiusb/tls/libtobii_osal.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
23266 stat("/usr/local/lib/tobiiusb/tls", 0x7ffdbcb20d80) = -1 ENOENT (No such file or directory)
23266 openat(AT_FDCWD, "/usr/local/lib/tobiiusb/haswell/x86_64/libtobii_osal.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
23266 stat("/usr/local/lib/tobiiusb/haswell/x86_64", 0x7ffdbcb20d80) = -1 ENOENT (No such file or directory)
23266 openat(AT_FDCWD, "/usr/local/lib/tobiiusb/haswell/libtobii_osal.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
23266 stat("/usr/local/lib/tobiiusb/haswell", 0x7ffdbcb20d80) = -1 ENOENT (No such file or directory)
23266 openat(AT_FDCWD, "/usr/local/lib/tobiiusb/x86_64/libtobii_osal.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
23266 stat("/usr/local/lib/tobiiusb/x86_64", 0x7ffdbcb20d80) = -1 ENOENT (No such file or directory)
23266 openat(AT_FDCWD, "/usr/local/lib/tobiiusb/libtobii_osal.so", O_RDONLY|O_CLOEXEC) = 3
23266 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@6\0\0\0\0\0\0"..., 832) = 832
23266 fstat(3, {st_mode=S_IFREG|0644, st_size=54270, ...}) = 0
23266 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa9213b8000
23266 mmap(NULL, 2141088, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa9211ad000
23266 mprotect(0x7fa9211b7000, 2093056, PROT_NONE) = 0
23266 mmap(0x7fa9213b6000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x9000) = 0x7fa9213b6000
23266 close(3) = 0
23266 openat(AT_FDCWD, "/usr/local/lib/tobiiusb/libtobii_libc.so", O_RDONLY|O_CLOEXEC) = 3
23266 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\"\0\0\0\0\0\0"..., 832) = 832
23266 fstat(3, {st_mode=S_IFREG|0644, st_size=56335, ...}) = 0
23266 mmap(NULL, 2161696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa920f9d000
23266 mprotect(0x7fa920fa8000, 2093056, PROT_NONE) = 0
23266 mmap(0x7fa9211a7000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xa000) = 0x7fa9211a7000
23266 mmap(0x7fa9211a9000, 15392, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa9211a9000
23266 close(3) = 0
23266 openat(AT_FDCWD, "/usr/local/lib/tobiiusb/libudev.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
23266 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
23266 fstat(3, {st_mode=S_IFREG|0644, st_size=81564, ...}) = 0
23266 mmap(NULL, 81564, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa920f89000
23266 close(3) = 0
23266 openat(AT_FDCWD, "/usr/lib/libudev.so.1", O_RDONLY|O_CLOEXEC) = 3
23266 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200Y\0\0\0\0\0\0"..., 832) = 832
23266 fstat(3, {st_mode=S_IFREG|0755, st_size=158016, ...}) = 0
23266 mmap(NULL, 162056, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa920f61000
23266 mprotect(0x7fa920f66000, 135168, PROT_NONE) = 0
23266 mmap(0x7fa920f66000, 94208, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5000) = 0x7fa920f66000
23266 mmap(0x7fa920f7d000, 36864, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c000) = 0x7fa920f7d000
23266 mmap(0x7fa920f87000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7fa920f87000
23266 close(3) = 0
23266 openat(AT_FDCWD, "/usr/local/lib/tobiiusb/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
23266 openat(AT_FDCWD, "/usr/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
23266 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\177\2\0\0\0\0\0"..., 832) = 832
23266 fstat(3, {st_mode=S_IFREG|0755, st_size=12976264, ...}) = 0
23266 mmap(NULL, 1856160, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa920d9b000
23266 mmap(0x7fa920dc1000, 1351680, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x26000) = 0x7fa920dc1000
23266 mmap(0x7fa920f0b000, 311296, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x170000) = 0x7fa920f0b000
23266 mmap(0x7fa920f57000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1bb000) = 0x7fa920f57000
23266 mmap(0x7fa920f5d000, 12960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa920f5d000
23266 close(3) = 0
23266 openat(AT_FDCWD, "/usr/local/lib/tobiiusb/libtobii_usb.so", O_RDONLY|O_CLOEXEC) = 3
23266 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\30\0\0\0\0\0\0"..., 832) = 832
23266 fstat(3, {st_mode=S_IFREG|0644, st_size=33286, ...}) = 0
23266 mmap(NULL, 2122072, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa920b94000
23266 mprotect(0x7fa920b9a000, 2093056, PROT_NONE) = 0
23266 mmap(0x7fa920d99000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5000) = 0x7fa920d99000
23266 close(3) = 0
23266 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa920b92000
23266 arch_prctl(ARCH_SET_FS, 0x7fa920b93040) = 0
23266 mprotect(0x7fa920f57000, 12288, PROT_READ) = 0
23266 mprotect(0x7fa920d99000, 4096, PROT_READ) = 0
23266 mprotect(0x7fa920f87000, 4096, PROT_READ) = 0
23266 mprotect(0x7fa9213b6000, 4096, PROT_READ) = 0
23266 mprotect(0x7fa9211a7000, 4096, PROT_READ) = 0
23266 mprotect(0x604000, 4096, PROT_READ) = 0
23266 mprotect(0x7fa9213e4000, 4096, PROT_READ) = 0
23266 munmap(0x7fa920f89000, 81564) = 0
23266 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fa920b93310) = 23267
23266 exit_group(0 <unfinished ...>
23267 umask(000 <unfinished ...>
23266 <... exit_group resumed>) = ?
23267 <... umask resumed>) = 022
23267 setsid( <unfinished ...>
23266 +++ exited with 0 +++
23267 <... setsid resumed>) = 23267
23267 brk(NULL) = 0x2368000
23267 brk(0x2389000) = 0x2389000
23267 openat(AT_FDCWD, "/var/run/tobiiusb/tobiiusbservice.pid", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
23267 fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
23267 write(3, "23267", 5) = 5
23267 close(3) = 0
23267 rt_sigaction(SIGTERM, {sa_handler=0x4023e0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fa920dd8000}, NULL, 8) = 0
23267 rt_sigaction(SIGUSR1, {sa_handler=0x402c70, sa_mask=[USR1], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fa920dd8000}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
23267 rt_sigaction(SIGUSR2, {sa_handler=0x402d30, sa_mask=[USR2], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fa920dd8000}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
23267 chdir("/") = 0
23267 close(0) = 0
23267 close(1) = 0
23267 close(2) = 0
23267 openat(AT_FDCWD, "/etc/udev/udev.conf", O_RDONLY|O_CLOEXEC) = 0
23267 fstat(0, {st_mode=S_IFREG|0644, st_size=49, ...}) = 0
23267 read(0, "# see udev.conf(5) for details\n\n"..., 4096) = 49
23267 read(0, "", 4096) = 0
23267 close(0) = 0
23267 access("/run/udev/control", F_OK) = 0
23267 socket(AF_NETLINK, SOCK_RAW|SOCK_CLOEXEC|SOCK_NONBLOCK, NETLINK_KOBJECT_UEVENT) = 0
23267 setsockopt(0, SOL_SOCKET, SO_ATTACH_FILTER, {len=10, filter=0x7ffdbcb20a20}, 16) = 0
23267 bind(0, {sa_family=AF_NETLINK, nl_pid=0, nl_groups=0x000002}, 12) = 0
23267 getsockname(0, {sa_family=AF_NETLINK, nl_pid=23267, nl_groups=0x000002}, [12]) = 0
23267 setsockopt(0, SOL_SOCKET, SO_PASSCRED, [1], 4) = 0
23267 openat(AT_FDCWD, "/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 1
23267 read(1, "0-3\n", 8192) = 4
23267 close(1) = 0
23267 sched_get_priority_max(SCHED_FIFO) = 99
23267 sched_get_priority_min(SCHED_FIFO) = 1
23267 writev(2, [{iov_base="/usr/local/sbin/tobiiusbserviced", iov_len=32}, {iov_base=": ", iov_len=2}, {iov_base="symbol lookup error", iov_len=19}, {iov_base=": ", iov_len=2}, {iov_base="/usr/local/lib/tobiiusb/libtobii"..., iov_len=40}, {iov_base=": ", iov_len=2}, {iov_base="undefined symbol: pthread_create", iov_len=32}, {iov_base="", iov_len=0}, {iov_base="", iov_len=0}, {iov_base="\n", iov_len=1}], 10) = -1 EBADF (Bad file descriptor)
23267 exit_group(127) = ?
23267 +++ exited with 127 +++
답변1
귀하의 액세스 시도는 헛된 것일 수 있습니다.
/proc/pid/fd/N
프로그램에 대한 유일한 접근이 블랙박스인 한, 달리기는
strace -f
아마도 당신이 할 수 있는 최선의 방법일 것입니다. (그런 다음strace
출력에서exit
및 를 검색write
하십시오.) 유사한 옵션은 디버거에서 프로그램을 실행해 보는 것입니다. 이를 자동화하려면 명확한 요구 사항을 식별하고 최선을 다한 다음 막히면 새로운 질문을 하십시오.아마도 가장 좋은 해결책은 화이트박스 액세스, 즉 소스 코드를 얻는 것입니다. 디컴파일러를 사용하여 바이너리에서 소스 코드를 생성하는 것이 옵션일 수 있습니다.
strace
제공한 출력을 보면 알 수 있습니다.- 자식 프로세스는 파일 설명자 3을 사용하여 "
23267
"를 씁니다/var/run/tobiiusb/tobiiusbservice.pid
. 이는 실제로 하위 프로세스의 PID입니다. - 시스템 호출을 사용하여 "/usr/local/sbin/tobiiusbserviced: 기호 조회 오류: /usr/local/lib/tobiiusb/libtobii...: 정의되지 않은 기호: pthread_create\n"을 파일 설명자 2 에 기록합니다
writev
. 위 문자열의 "..."는 문자 그대로 세 개의 점이 아니라 출력이 너무 장황해지는 것을 방지하기 위해 잘린 텍스트를 나타냅니다. 전체 데이터를 보려면--verbose=write
또는--verbose='/write*'
옵션을 에 전달해 보세요strace
. 및/또는--write=all
(또는--write=0,1,2,3,4,5,6,7
"all
"가 작동하지 않는 경우) - 프로그램이 이전에 파일 설명자 0, 1, 2를 닫았기 때문에 위의 오류 메시지는 어디에도 나타나지 않습니다.
- 예상한 대로 하위 프로세스는 상태 127(
exit_group
시스템 호출 사용)로 종료됩니다.
- 자식 프로세스는 파일 설명자 3을 사용하여 "