Как сделать перенаправление вывода оболочки (>), пока script все еще работает?

Я написал короткий script, который никогда не заканчивается. Этот script непрерывно генерирует выходные данные, которые я должен проверять время от времени. Я запускаю его на лабораторном компьютере через SSH и перенаправляю вывод в файл в моей папке public_html на этой машине.

python script.py > ~/public_html/results.txt

Однако, когда я обновляю адрес, результаты не отображаются. Результаты появляются, когда я заканчиваю программу, но, как я уже сказал, она не останавливается сама по себе. Является ли это перенаправление (>) ленивым с записью? Есть ли способ непрерывно (или с интервалом) обновлять результаты в файле?

Или это веб-сервер, который не обновляет файл, пока он еще написан?

Ответ 1

Вам нужно очистить вывод sys.stdout.flush() (или smth), если вы хотите его сразу увидеть. См. this

Ответ 2

stdout буферизуется, если не подключен к терминалу.

Вы можете изменить эту политику на буферизацию строки с помощью stdbuf

stdbuf -oL python script.py > ~/public_html/results.txt

Таким образом, вам не нужно скрывать свой Python script и поддерживать его в режиме ввода-вывода, если не требуется буферизация строк.

Ответ 3

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

Сначала я попробую принудительную перезагрузку (Ctrl + F5 или Ctrl + Shift + R или Shift + <reload_button > ) и посмотрим, поможет ли это. Если это не так, вы можете попробовать что-то еще.

В отдельной оболочке на сервере сделайте

tail -f ~/public_html/results.txt

Хвост печатает последние n строк файла (где n по умолчанию - 10), но параметр -f контролирует файл и продолжает сообщать о выходе по мере роста файла. Это, по крайней мере, даст вам уверенность в том, что файл записывается постепенно.

Я надеюсь, что это поможет.