gpt4 book ai didi

linux - 无法理解进程的 strace

转载 作者:太空宇宙 更新时间:2023-11-04 05:21:36 26 4
gpt4 key购买 nike

我有一个作为守护进程运行的 perl 脚本。它每 10 秒访问一次数据库,如果队列中有任何作业,它会生成一个单独的 shell 来执行单个作业。但脚本经常无法从数据库获取作业​​。

理想情况下应该像这样调用数据库

read(3, "\3def\3job\rqueueb\7JobTy"..., 55) = 55
read(3, ";\0\0\6", 4) = 4

下面是这个守护进程/进程的跟踪。是在等待什么吗?我感谢任何帮助。

pipe([6, 7])                            = 0
pipe([8, 9]) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0) = 31858
close(9) = 0
close(7) = 0
read(8, "", 4) = 0
close(8) = 0
fcntl64(6, F_GETFL) = 0 (flags O_RDONLY)
fstat64(6, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xfffffffff7783000
_llseek(6, 0, 0xffd4e540, SEEK_CUR) = -1 ESPIPE (Illegal seek)
fstat64(6, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
read(6, "", 4096) = 0
close(6) = 0
munmap(0xf7783000, 4096) = 0
rt_sigaction(SIGHUP, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGINT, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
waitpid(31858, 0xffd4e670, 0) = -1 ECHILD (No child processes)
rt_sigaction(SIGHUP, {SIG_DFL, [], 0}, NULL, 8) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], 0}, NULL, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, [], 0}, NULL, 8) = 0

并且这会立即重复(至少)两次。

最佳答案

创建一个子进程(克隆),尝试从中获取数据(读取6)。子进程关闭了管道,因此读取返回 EOF (0)。这被认为是子进程已退出的标志,因此它尝试获取子进程 (waitpid)。此操作失败 (-1),这意味着 $SIG{CHLD} 必须已设置为 IGNORE。该状态可能有用。

8/9 管道的存在表明子进程将调用 exec。该管道用于通知父级操作文件句柄或调用 exec 时发生的错误。子进程会将 9 设置为 close-on-exec,因此从该管道接收到没有任何数据的 EOF(如此处的情况)表明 exec 成功。

关于linux - 无法理解进程的 strace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41157238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com