Есть ли что-нибудь похожее на "сценарий", но не требующее открытия терминала?
Я хочу сохранить результаты моей программы в файл, однако у меня есть некоторые проблемы. Мне нужно работать удаленно, но у меня плохое интернет-соединение. Поэтому я обычно запускаю:
./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 ничего не записывается.
Есть ли что-нибудь похожее на скрипт
, но не требующее открытия терминала?
Когда вы хотите добавить в стандартный вывод, вы можете использовать >>
вместо просто >
:
./MyProgram.exe >> output.txt 2> error.txt &
Это предотвратит перезапись вашего вывода каждый раз.
Это, очевидно, не остановит процесс от выхода при закрытии сессии. Если nohup
доступен, вы должны использовать его для запуска вашей программы, и это позволит ей продолжить выполнение, даже если сессия закрыта.
Попробуйте команду
stdbuf -oL ./MyProgram.exe > output.txt
Стандартный вывод программ по умолчанию буферизован в строках, если вывод осуществляется через терминал, но буферизован в кусках по 4 кБ, если вывод осуществляется в обычный файл (что и происходит сейчас, поскольку вы перенаправляете его в output.txt).
Это означает, что стандартные функции stdio (такие как printf()) собирают данные до 4 кБ, прежде чем вывести их на экран. Если ваша утилита падает, то - очень жаль - этот последний кусок, который еще не был записан, будет потерян.
stdbuf -oL
устанавливает буферизацию стандартного вывода в строку, даже если вывод идет в обычный файл.
(Хотя, несомненно, самым чистым решением было бы исправить ваше приложение, чтобы оно не аварийно завершалось.)
Вы можете далее комбинировать это с nohup
или screen
, как показано в других ответах.
Просто попробуйте что-нибудь вроде:
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
Если это не удается - вы, вероятно, должны рассмотреть возможность использования отладчика, декомпилятора, дизассемблера и т. д.
Дайте мне знать, как вы справитесь, и я скорректирую этот пост соответствующим образом.
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 и других.