Запись вывода в файл, аналогичная команде «скрипт»?

Есть ли что-нибудь похожее на "сценарий", но не требующее открытия терминала?

Я хочу сохранить результаты моей программы в файл, однако у меня есть некоторые проблемы. Мне нужно работать удаленно, но у меня плохое интернет-соединение. Поэтому я обычно запускаю:

./MyProgram.exe > output.txt &

И результаты моей программы сохраняются в файле output.txt.

Однако, когда я запускаю свою программу на определенных объектах, я получал ошибку «SIGSEGV: Segmentation fault». Программа закрывается, и это нормально, я знаю, что она сделает это. Но в конечном итоге я теряю все свои данные из предыдущих объектов до того, как программа обнаружила этот проблемный объект, вызывающий ошибку.

Как я могу записать все, результаты от непроблемных объектов, а также эту ошибку, в файл / ы?

Я пробовал:

./MyProgram.exe > output.txt 2>&1 &

./MyProgram.exe > output.txt 2> error.txt &

./MyProgram.exe > & error-n-output.txt &

Но все вышеперечисленное просто записывает ошибку сегментации, но не результаты от предыдущих объектов, хотя я знаю, что программа действительно работает с предыдущими объектами.

Я также попробовал команду script , набрав следующее:

Myname @ Computer ~ / Folder $ script screen.log
Скрипт запущен, файл screen.log
Myname @ Computer ~ / Folder $ ./ MyProgram.exe
~~~ РЕЗУЛЬТАТЫ И ОШИБКА СЕГМЕНТАЦИИ ПЕЧАТИВАЮТСЯ НА ЭКРАНЕ, ПОЭТОМУ Я МОГУ ЗАПИСАТЬ РЕЗУЛЬТАТЫ ДЛЯ НЕКОТОРЫХ ОБЪЕКТОВ И ПРОПУСТИТЬ ОШИБКУ ~~
Myname @ Computer ~ / Folder $ exit
выход
Скрипт готов, файл screen.log

И все, что было на экране, записывается в файл screen.log. Это может быть нормально, однако из-за плохого подключения к Интернету я не могу оставлять экран включенным на долгое время. Мне нужно выйти из терминала, но, конечно, моя программа закрывается, и в файле screen.log ничего не записывается.

Есть ли что-нибудь похожее на скрипт , но не требующее открытия терминала?

0
15.05.2016, 01:45
4 ответа

Когда вы хотите добавить в стандартный вывод, вы можете использовать >> вместо просто >:

./MyProgram.exe >> output.txt 2> error.txt &

Это предотвратит перезапись вашего вывода каждый раз.

Это, очевидно, не остановит процесс от выхода при закрытии сессии. Если nohup доступен, вы должны использовать его для запуска вашей программы, и это позволит ей продолжить выполнение, даже если сессия закрыта.

0
28.01.2020, 02:48

Попробуйте команду

stdbuf -oL ./MyProgram.exe > output.txt

Стандартный вывод программ по умолчанию буферизован в строках, если вывод осуществляется через терминал, но буферизован в кусках по 4 кБ, если вывод осуществляется в обычный файл (что и происходит сейчас, поскольку вы перенаправляете его в output.txt).

Это означает, что стандартные функции stdio (такие как printf()) собирают данные до 4 кБ, прежде чем вывести их на экран. Если ваша утилита падает, то - очень жаль - этот последний кусок, который еще не был записан, будет потерян.

stdbuf -oL устанавливает буферизацию стандартного вывода в строку, даже если вывод идет в обычный файл.

(Хотя, несомненно, самым чистым решением было бы исправить ваше приложение, чтобы оно не аварийно завершалось.)

Вы можете далее комбинировать это с nohup или screen, как показано в других ответах.

0
28.01.2020, 02:48

Просто попробуйте что-нибудь вроде:

program.exe &> /temp/output.log ;
# OR #
program.exe &> /temp/output.log &

В некоторых обстоятельствах вы можете захотеть следить за изменениями, используя что-нибудь вроде:

watch cat /temp/output.log
# OR #
watch --diff cat /temp/output.log

Или аналогично:

watch tail /temp/output.log
# OR #
watch --diff tail /temp/output.log

Трудно сказать, что именно вам нужно, но вы можете найти следующие утилиты полезными:

script
# OR #
asciinema

Если это не удается - вы, вероятно, должны рассмотреть возможность использования отладчика, декомпилятора, дизассемблера и т. д.

Дайте мне знать, как вы справитесь, и я скорректирую этот пост соответствующим образом.

0
28.01.2020, 02:48

nohup - это, вероятно, то, что вам нужно. Назначение nohup - "выполнить команду, игнорируя сигналы зависания". Другими словами, если ваше ssh, telnet, serial и т.д. соединение разрывается по любой причине (кроме сбоя, выключения или перезагрузки хоста, конечно), ваша программа будет продолжать работать.

Возможно, вы также захотите запустить команду nohup-ed в фоновом режиме (используя &), поскольку весь вывод будет перенаправлен в файл.

Например:

nohup MyProgram.exe &

По умолчанию она сохраняет вывод в ./nohup.out или ~/nohup.out, но вы можете перенаправить вывод в другой файл, если хотите. Из man-страницы:

Если стандартный ввод - терминал, перенаправьте его из нечитаемого файла. Если стандартный вывод является терминалом, добавьте вывод в nohup.out, если это возможно, $HOME/nohup.out в противном случае. Если стандартная ошибка является терминалом, перенаправьте ее на стандартный вывод. Чтобы сохранить вывод в FILE, используйте nohup COMMAND > FILE.

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

Если вам нужно запустить программу, которая напрямую взаимодействует с пользователями (например, приложение ncurses), используйте терминальный мультиплексор, такой как GNU screen, или tmux, или byobu или аналогичный вместо nohup.

Терминальные мультиплексоры не только делают вашу программу невосприимчивой к сигналам зависания, они также позволяют вам повторно подключаться к тому же сеансу оболочки (и вашей запущенной программе), когда вы снова входите в систему после разрыва связи. Они также позволяют использовать несколько сеансов оболочки через одно соединение (например, ssh на удаленную машину, запустите screen, и вы сможете создавать, уничтожать и переключаться между сколь угодно большим количеством "окон" оболочки).

BTW, все эти программы предоставляют вам стандартную оболочку, так что вы можете запускать script внутри них, если захотите.

Я привел ссылки на домашние страницы этих программ, но вам, вероятно, не нужно компилировать их для установки - они доступны в виде предварительно скомпилированных пакетов для большинства (всех?) дистрибутивов Linux, FreeBSD, Mac OS X, Solaris и других.

1
28.01.2020, 02:48

Теги

Похожие вопросы