
Я хотел бы узнать, в каком из моих ~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
Что верно. Я запустил его в окне screen Window 3. Поскольку это переменная окружения, есть большая вероятность, что ваша задача также унаследует ее (в зависимости от того, какой вид exec()
вызовов используется), поэтому вы, вероятно, можете также изучить окружение своей задачи и найти тот же результат.