我想找出我的大约 50 个 gnu screen 窗口中的哪一个正在运行一个带有特定变量的进程。例如,大约一周前,我做了以下事情:
id=ABC123456; ~/run_long_process $id
它在我的 ~50 个 gnu screen 窗口之一中运行,并产生大量 STDOUT/STDERR,但除了向后滚动每个窗口或按 Ctrl+Z 并恢复每个窗口外,还有其他方法可以找出它是哪一个吗?有什么建议吗?
答案1
如果这是 Linux,您可以遵循类似这样的过程。作为“长时间运行的进程”的示例,我将使用“perl -e sleep”,它将永远处于休眠状态:
$ id=ABC123456; perl -e sleep $id
现在,我们需要找到正在运行的进程:
$ ps -Af | grep [A]BC123456
user 30579 22013 0 09:32 pts/10 00:00:00 perl -e sleep ABC123456
# ^^^^^ parent PID
现在我们有了父进程的 PID,我们就可以窥探它的环境,在其中screen
设置一个WINDOW
变量:
$ tr '\0' '\n' < /proc/22013/environ | grep WINDOW
WINDOW=3
这是正确的。我在屏幕窗口 3 中运行它。由于这是一个环境变量,因此您的任务也很有可能继承它(取决于exec()
使用哪种类型的调用),因此您可能也可以窥探任务的环境,并找到相同的结果。