代码之家  ›  专栏  ›  技术社区  ›  Å imon Tóth

系统调用中断的奇怪错误,我无法调试

  •  0
  • Å imon Tóth  · 技术社区  · 14 年前

    我正在开发一个批处理系统(Torque),现在最重要的部分是:当一个交互式作业运行时,submit工具将与执行主机通信。这在其中一台机器上失败。

    这是strace输出:

    16:18:36.219925 fcntl(4, F_GETFL)       = 0x2 (flags O_RDWR)                                                                                                          
    16:18:36.219925 read(4, "610.torque1.ics.muni.cz\0\0\0\0\0\0\0\0\0\0"..., 16385) = 1046                                                                               
    16:18:36.219925 write(4, "TERM=xterm\0\0\0\0\0\0\220\5\377\377\377\177\0\0\214\303u\310\277\177\0\0\26"..., 80) = 80                                                  
    16:18:36.219925 write(4, "\3\34\177\25\4\32"..., 6) = 6                                                                                                               
    16:18:36.219925 write(4, "WINSIZE 46,166,0,0\0\0\0\0\0\0\1@\0\0\0\0\0\0\0"..., 80) = 80                                                                               
    16:18:36.219925 write(1, "qsub: job 610.torque1.ics.muni.cz"..., 41qsub: job 610.torque1.ics.muni.cz ready  ) = 41
    16:18:36.219925 rt_sigaction(SIGINT, {SIG_IGN}, NULL, 8) = 0
    16:18:36.219925 rt_sigaction(SIGTERM, {SIG_IGN}, NULL, 8) = 0
    16:18:36.219925 rt_sigaction(SIGALRM, {SIG_IGN}, NULL, 8) = 0
    16:18:36.219925 rt_sigaction(SIGTSTP, {SIG_IGN}, NULL, 8) = 0
    16:18:36.219925 clone(Process 20724 attached child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fbfc9a2d770) = 20724
    

    执行主机部分:

    [pid  8778] 15:59:16.371145 getsockopt(3, SOL_SOCKET, SO_ERROR, [4294967296], [4]) = 0                                                                                
    [pid  8778] 15:59:16.371145 fcntl(3, F_GETFL) = 0x802 (flags O_RDWR|O_NONBLOCK)                                                                                       
    [pid  8778] 15:59:16.371145 fcntl(3, F_SETFL, O_RDWR) = 0                                                                                                             
    [pid  8778] 15:59:16.371145 write(3, "609.torque1.ics.muni.cz\0\0\0\0\0\0\0\0\0\0"..., 1046) = 1046                                                                   
    [pid  8778] 15:59:16.371145 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)                                                                                                    
    [pid  8778] 15:59:16.375144 read(3, 0x717ae0, 80) = ? ERESTARTSYS (To be restarted)                                                                                   
    [pid  8778] 15:59:21.367024 --- SIGALRM (Alarm clock) @ 0 (0) ---                                                                                                     
    [pid  8778] 15:59:21.367024 rt_sigreturn(0x8) = -1 EINTR (Interrupted system call)                                                                                    
    [pid  8778] 15:59:21.367024 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0                                                          
    [pid  8778] 15:59:21.367024 write(2, "pbs_mom: LOG_ERROR::Interrupted s"
    

    编辑:这些实际上是单独的运行,但输出总是完全相同的。

    3 回复  |  直到 14 年前
        1
  •  1
  •   caf    14 年前

    因为这似乎是套接字接收端的超时,所以可以尝试设置 TCP_NODELAY 发送端的套接字选项。

        2
  •  0
  •   lorenzog    14 年前

    here . 显然地,

    但到目前为止还没有人 找到了。那主要是因为

    一些与资源耗尽有关的东西,触发一个信号,该信号被传递给userland(应该在内核级别捕获)。

    这可能与超级用户.com不过,这是我最好的提示:

    • 它总是在同一台机器上触发吗?
    • 如果你试着用小一点的窗户?还是更大?

    另请参见 here

        3
  •  0
  •   Community CDub    7 年前

    您是否正在检查 read ? 你应该是。如果失败,请检查 errno . 如果是的话 EINTR ,您需要重试读取。(或者如果它是 lorenzog's answer

    对我来说也是一样 write ,检查返回值并 .