无法向Ruby

时间:2017-08-01 04:30:20

标签: ruby signals pty

我在阿尔卑斯码头工人的容器中运行红宝石(如果这很重要的话,它是一名侧面工人)。在某个时刻,我的应用程序收到shell命令的命令。我需要能够流式传输STDOUT而不是缓冲区。这就是我使用PTY而不是system()或其他类似答案的原因。我正在执行以下代码行:

stdout, stdin, pid = PTY.spawn(my_cmd)

当我连接到docker容器并运行ps auxf时,我看到了:

root         7  0.0  0.4 187492 72668 ?        Sl   01:38   0:00 ruby_program
root     12378  0.0  0.0   1508   252 pts/4    Ss+  01:38   0:00  \_ sh -c my_cmd
root     12380  0.0  0.0  15936  6544 pts/4    S+   01:38   0:00      \_ my_cmd

请注意ruby的子进程是" sh -c my_cmd&#34 ;,它本身就有一个孩子" my_cmd"过程

" my_cmd"可能需要很长时间才能运行。它的设计使得向进程发送信号USR1使其保存其状态,以便以后可以恢复并干净地中止。

问题是pid从" PTY.spawn()"是" sh -c my_cmd"的pid;过程,而不是" my_cmd"处理。所以当我执行:

Process.kill('USR1', pid)

它将USR1发送给sh,而不是发送给my_cmd,因此它不会表现得如此。

有没有办法获得与我实际指定的命令相对应的pid?我对PTY之外的想法持开放态度,但它需要满足以下约束条件:

1)我需要能够在写入时从STDOUT和STDERR流式传输输出,而无需等待它们被刷新(因为STDOUT和STDERR混合在一起成为PTY中的单个流,I' m将STDERR重定向到文件并使用inotify获取更新。

2)我需要能够将USR1发送到进程才能暂停它。

1 个答案:

答案 0 :(得分:0)

我放弃了一个干净的解决方案。我终于刚刚执行了

dcast(
    dtt,
    Group + rowid(Species, Annotation) ~ Species,
    value.var = 'Mean_expression')[, Species := NULL]

获取子pid,然后我可以将USR1发送到该进程。感觉很讨厌,但是当红宝石给你柠檬时......