我在阿尔卑斯码头工人的容器中运行红宝石(如果这很重要的话,它是一名侧面工人)。在某个时刻,我的应用程序收到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发送到进程才能暂停它。
答案 0 :(得分:0)
我放弃了一个干净的解决方案。我终于刚刚执行了
dcast(
dtt,
Group + rowid(Species, Annotation) ~ Species,
value.var = 'Mean_expression')[, Species := NULL]
获取子pid,然后我可以将USR1发送到该进程。感觉很讨厌,但是当红宝石给你柠檬时......