実際にフォークされたプロセスをキャンセルしています

実際にフォークされたプロセスをキャンセルしています

複製できる実行可能なバイナリ(ソース化されていない)があります。何も印刷せず、子供が私が欲しいものを印刷しようとしているようです。子プロセスが実際に失敗しても、常に正常に返されます。私の子供の返品コードを知りたいです。プロンプトもすぐに返されますが、魔法のようにフォークを解放するか、サブプロセスが終了するのを待つように前景で実行したいと思います。

どうですか?ただLinux。

私は少なくとも出力を取得し、前景にとどまる次のスクリプトを試しました。

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。上の文字列の「...」は、文字通り3つの点ではなく、出力が冗長になるのを防ぐために切り捨てられたテキストを表します。データ全体を表示するには、--verbose=writeまたは--verbose='/write*'オプションをに渡しますstrace。および/または  --write=all(または  --write=0,1,2,3,4,5,6,7" all"が機能しない場合)
    • プログラムが以前にファイル記述子0、1、2を閉じていたため、上記のエラーメッセージはどこにも表示されません。
    • 予想通り、サブプロセスは状態127(exit_groupシステムコールを使用)で終了します。

関連情報