bash lsof: получить pid от одного tty к другому - PullRequest
0 голосов
/ 15 февраля 2012

Как получить pid в tty1 процесса, запущенного в tty2?

Контекст:
Попытка написать однострочную версию bash, чтобы убить процесс, генерирующий файл, когда этот файл превышает предопределенный максимальный размер. (Однострочник еще не работает, так как необходимо встроить его в цикл).

Во время тестирования смысл в том, что lsof не возвращает PID в терминале tty1, несмотря на то, что pid существует в tty2, где выполняется команда.

tty1: создание файла и мониторинг изменений

MAX_SIZE_Ko=10001;file=test_lsof;dd if=/dev/zero of=$file bs=1k count=800;inotifywait $file;SIZE_Ko=$(du -s $file | cut -f1); [[ "$SIZE_Ko" -gt "$MAX_SIZE" ]] && ( PID=$(lsof $file | tail -n1 | awk -F" " '{ print $2 }') ; [[ ! -z $PID ]] && kill -9 $PID || echo "no running PID modifying $file" )

tty2: увеличение размера файла

for (( 1; 1; 1));do echo -e "foobar\n" >> test_lsof; echo $(( i++ ))" - pid="$$; done

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Как уже упоминалось в другом ответе, файл открывается только на короткое время, поэтому шансы на то, что он его поймает, низкие.

Однако вы можете изменить это:

exec 5>test_lsof
for (( 1; 1; 1)); do
    echo -e "foobar\n" >&5  
    echo $(( i++ ))" - pid="$$
done

При этом используется расширенное перенаправление оболочки - строка exec открывает дескриптор файла, а> & 5 перенаправляет вывод команды из этого дескриптора файла.

Если вы сделаете это, оболочка будет видна lsof.

1 голос
/ 16 февраля 2012

Проблема в том, что процесс в tty2 открывает файл только на долю секунды, чтобы добавить строку.Если вы не запустите lsof за ту же долю секунды, вы не поймаете его.

Один из способов справиться с этим - использовать inotify-tools .Программа inotifywait позволяет дождаться открытия файла и запуска lsof, например inotifywait $file; lsof $file.

...