Как подавить вывод команды, но показать ее, если команда выхода кодирует ошибку?
задан Xster 898
3 ответа 3
К сожалению, предположение, что stderr используется только для вывода ошибок, не всегда верно. Скорее, stderr часто используется для любого и всех интерактивных выводов и диагностики, т.е. выводов, предназначенных для чтения пользователем в интерактивном приглашении 1 . wget и dd — известные примеры.
Некоторые команды предоставляют флаг (например, -quiet или -silent ) для подавления вывода без ошибок — прочитайте их справочные страницы, чтобы увидеть, существует ли он.
Другое соглашение, которое выполняется чаще, — это код выхода: программа возвращает код выхода при выходе. Как правило, 2 , код выхода 0 указывает на успех, а любой другой код выхода указывает на ошибку.
С помощью bash вы можете получить код выхода последней команды из $? переменная. В fish используйте переменную $status . Вы можете передать stderr во временный файл и распечатать его только в случае возникновения ошибки. Например ( fish ):
Стандартные потоки ввода/вывода в Linux. Урок 12.
command 2>/tmp/outputbuffer if $status cat /tmp/outputbuffer rm /tmp/outputbuffer
Вы также можете использовать некоторые сочетания клавиш, если вы не объединяете команды:
if command 2>/tmp/outputbuffer cat /tmp/outputbuffer rm /tmp/outputbuffer
command 2>/tmp/outputbuffer; or cat /tmp/outputbuffer; rm /tmp/outputbuffer;
Вы также можете направить стандартный stdout в тот же буфер, используя 2>/tmp/outputbuffer .
(Примечание: я на самом деле не знаю fish , поэтому я адаптирую концепцию к тому, что я могу найти в ее документации. Синтаксис может быть немного неправильным. Также вы можете использовать mktemp для генерации уникального временного файла — запустите его и запишите имя файла в переменной.)
Если вам нужно запустить все это одновременно в фоновом режиме оболочки, которую вы также используете в интерактивном режиме, то вам лучше написать сценарий для обработки сокрытия вывода и запустить этот сценарий в фоновом режиме с помощью стандартных приемов. ( fish ). Черт возьми, вы можете поместить что-то вроде следующей функции в ~/.config/fish/config.fish :
function run-silent set temp (mktemp) if $argv 2>$temp cat $temp rm $temp end
Вызов с run-silent somecommand заставляет его работать в фоновом режиме)
Обратите внимание, что это поглотит исходный код завершения и сбросит как stdout и stderr в случае сбоя. Вы можете настроить его по мере необходимости.
1 Нет даже гарантии, что вывод ошибок не появится на stdout — некоторые программы будут выводить весь вывод там!
2 К сожалению, это не всегда так — код выхода полностью контролируется программой, а некоторые укажут некоторые условия успеха с ненулевыми выходами. Снова, проверьте руководство.
Источник: poweruser.guru
Управление процессами в Linux Перевести процесс в фоновый режим
Русские Блоги
фоновая программа linux и перенаправление вывода терминала
Один, используйте сцену
Если вы хотите, чтобы ваши собственные приложения были доступны из внешней сети, наиболее распространенной операцией является развертывание службы на сервере (вы также можете использовать инструменты проникновения во внутреннюю сеть, такие как peanut shell / ngrok, локально, чтобы сделать службу доступной из внешней сети). сеть). Сервер входа в службу развертывания часто использует инструменты терминала, такие как xshell, для выполнения команд оболочки для развертывания службы на машине Linux. Вы можете часто сталкиваться с выводом журнала приложения на экран терминала, закрытие терминала или программа Ctrl + c завершит операцию. В это время программа должна иметь возможность работать в фоновом режиме и перенаправлять вывод терминала в указанный файл. Чтобы просмотреть журнал службы, вы можете просмотреть содержимое, используя такие команды, как more / less для анализа текущий статус службы.
Два, программный фоновый командный режим
Вот список часто используемых методов, которые можно запускать в фоновом режиме:
1.nohup
Задача nohup — заставить отправленную команду игнорировать сигнал зависания.
Формат: аргументы команды nohup
nohup ./main > /tmp/webcrawler.log 2>
Mian — это двоичный файл Go, который можно запустить на собственном сервере,> /tmp//webcrawler.log — перенаправляет стандартный вывод в файл webcrawler.log в этом каталоге, 2> означает добавление в фон (он будет отключен, если вы покинете терминал, и nohup не будет добавлен)。
2.disown
Если есть запущенные программы, которые не работают в фоновом режиме, вы можете попробовать следующие методы.
ctrl + z # Приостановить программу вакансии # Просмотр номера вакансии bg job_id # Запускаем в фоновом режиме disown -h %job_id
3.screen
Screen — это бесплатное программное обеспечение для переключения терминалов из командной строки, разработанное проектом GNU. Пользователи могут одновременно подключать несколько локальных или удаленных сеансов командной строки с помощью программного обеспечения и свободно переключаться между ними. После использования screen, это дочерний процесс init (PID равен 1), и на него не повлияет сигнал HUP.
-A Настроить все окна по размеру текущего терминала. -d перевести указанное задание экрана в автономный режим. -h Укажите количество строк в буфере окна. -m Даже если операция экрана выполняется в данный момент, создание новой операции экрана по-прежнему является обязательным. -r Возобновить автономные задания экрана. -R Пытаться сначала возобновить автономные задания. Если офлайн-задание не найдено, создается новое экранное задание. -s Указать оболочку, которая будет выполняться при создании нового окна. -S Укажите имя задания экрана. -v Показать информацию о версии. -x Возобновить ранее выполнявшееся задание экрана. -ls или —list отображает все текущие экранные операции. -wipe Проверить все текущие задания экрана и удалить задания экрана, которые больше не доступны.
Общее использование
screen -S name -> Создать новый сеанс с именем name
screen -dms name -> Создать отдельный сеанс
screen -ls -> Список всех текущих сеансов
screen -r name -> Вернуться к сеансу имени
screen -d name -> удаленно отсоединить сеанс # CTRL-a d горячая клавиша терминала текущий сеанс
screen -d -r name -> завершить текущий сеанс и вернуться к сеансу имени
4.setsid
принадлежит второй стратегии. Процесс не является дочерним процессом терминала, получающего сигнал HUP, поэтому, естественно, на него не будет влиять сигнал HUP.
setsid # set session id Usage: setsid [options] [arguments . ]
Run a program in a new session.
Options:
-c, —ctty set the controlling terminal to the current one
-w, —wait wait program to exit, and use the same return
-h, —help display this help and exit
-V, —version output version information and exit
3. Команды управления задачами, обычно используемые при работе в фоновом режиме.
1.jobs
Просмотрите задачу и верните номер задачи n и номер процесса.
Параметр jobs -l может отображать идентификаторы PID всех задач. Состояние заданий может быть запущено, остановлено или завершено. Но если задача завершена (kill), оболочка удаляет идентификатор процесса задачи из списка, известного текущей среде оболочки.
2.bg %n
Перенести задачу с номером n для работы в фоновом режиме
3.fg %n
Перенести задачу номер n на передний план
4.ctrl+z
Приостановить текущую задачу
5.ctrl+c
Завершить текущую задачу
В-четвертых, стандартный вывод и вывод ошибок (в основном участвует в фоновой программе)
Вы можете часто видеть в оболочке: 1> / dev / null 2> /dev/null 2>/dev/null
Результат команды может быть определен в виде%>.
/ dev / null представляет собой пустой файл устройства
> указывает, куда перенаправить, например: echo «123»> /home/123.txt.
1 означает стандартный вывод stdout, системное значение по умолчанию — 1, поэтому «> / dev / null» эквивалентно «1> / dev / null»
2 означает стандартную ошибку stderr
/ dev / null сначала означает, что стандартный вывод перенаправляется в пустой файл устройства, то есть никакая информация не выводится на терминал или, проще говоря, никакая информация не отображается.
2> стандартный вывод — это вывод команд и по умолчанию указывает на экран; стандартная ошибка — это вывод сообщений об ошибках команд и по умолчанию указывает на экран.
Если явное перенаправление отсутствует, команда считывает ввод с экрана через файловый дескриптор 0 и выводит вывод и информацию об ошибках на экран через файловые дескрипторы 1 и 2. Но если мы хотим читать ввод или генерировать вывод из других файлов (опять же, устройства ввода-вывода также являются файлами в Unix / Linux), нам нужно использовать перенаправление для 0, 1 и 2. Синтаксис следующий:
command имя файла Перенаправить стандартный вывод в файл с именем файла (перезаписать) команда 1> имя поля Перенаправить стандартный вывод в файл с именем файла (перезаписать) команда >> имя файла Перенаправить стандартный вывод в файл с именем файла (добавить) команда 1 >> имя файла Перенаправить стандартный вывод в файл с именем файла (добавить) команда 2> имя файла Перенаправить стандартную ошибку в файл с именем файла (перезаписать) команда 2 >> имя файла Перенаправить стандартный вывод в файл с именем файла (добавить) команда> имя файла 2> > имя файла 2> перед правой стороной.
4) Между дескриптором файла и символом перенаправления не должно быть пробелов!
1. Стандартное управление вводом
Синтаксис:Команда Используйте файлы в качестве входных данных для команд.
Например:
Считайте файл file1 содержимым письма с проверкой имени темы и отправьте его получателю.
2. Стандартный выходной контроль
Синтаксис:Команда> ФайлОтправить результат выполнения команды в указанный файл.
Например:
ls -l > list
Записать результат выполнения команды «ls -l» в список файлов.
грамматика:Команда>! ФайлОтправить результат выполнения команды в указанный файл, если файл уже существует, он будет перезаписан.
Например:
ls -lg >! list
Заменить результат выполнения команды «ls-lg» в список файлов.
Синтаксис:Команда> > ФайлДобавить результат выполнения команды в указанный файл.
Например:
ls — lag >> list
Добавить результат выполнения команды «ls-lag» в список файлов.
Синтаксис:Команда >> >> list
Добавьте любую информацию, появившуюся на экране при компиляции file2.c, в файл error.
3) О вводе, выводе и выводе ошибок
В среде символьного терминала концепция стандартного ввода / вывода хорошо понятна. Ввод относится к вводу приложения или команды, независимо от того, вводится ли он с клавиатуры или из другого файла; вывод относится к некоторой информации, генерируемой приложением или командой; в отличие от системы Windows, существует другая концепция стандартного вывода ошибок Эта концепция в основном предназначена для отладки программ и обслуживания системы.Отделение вывода ошибок от стандартного вывода позволяет некоторым расширенным сообщениям об ошибках не мешать нормальной выводимой информации, что удобно для обычных пользователей.
В системах Linux: стандартный ввод (stdin) по умолчанию соответствует вводу с клавиатуры; стандартный вывод (stdout) по умолчанию — вывод на экран; стандартный вывод ошибок (stderr) также выводится на экран по умолчанию (std выше) представляет собой стандарт). Эти концепции обычно используются в BASH.Стандартный вывод представлен как 1, а стандартный вывод ошибок представлен как 2. Ниже мы покажем, как их использовать, особенно стандартный вывод и стандартный вывод ошибок.
Ввод, вывод и стандартный вывод ошибок в основном используются для перенаправления ввода-вывода, что означает, что их настройки по умолчанию необходимо изменить.
ls > ls_result ls -l >> ls_result
Две приведенные выше команды перенаправляют результат выполнения команды ls в файл ls_result и добавляют его в файл ls_result вместо вывода на экран. «>» — типичный символ для перенаправления вывода (стандартный вывод и стандартный вывод ошибок). Два последовательных символа «>», то есть «>>» означают добавление вывода без очистки оригинала. Давайте посмотрим на немного более сложный пример:
find /home -name lost* 2> err_result
Эта команда имеет дополнительную цифру «2» перед символом «>»,«2>» означает перенаправление стандартного вывода ошибок.. Поскольку некоторые каталоги в каталоге / home недоступны из-за ограничений прав доступа, будет сгенерирован стандартный вывод ошибок, который будет сохранен в файле err_result. Вы можете себе представить, какие результаты даст команда find / home -name lost * 2 >> err_result?
Если вы выполните команду find / home -name lost *> all_result напрямую, в результате в файле all_result будет сохранен только стандартный вывод. Если вы хотите, чтобы стандартный вывод ошибок сохранялся в так же, как и стандартный ввод в файл, что мне делать? Взгляните на следующий пример:
find /home -name lost* > all_result 2> /dev/null
Вы можете самостоятельно протестировать следующие методы перенаправления:
find /home -name lost* > all_result 1> all_result 1> all_result
Еще один очень полезный оператор перенаправления — «-«
(cd /source/directory tar cf — . ) | (cd /dest/directory tar xvfp -)
Эта команда предназначена для сжатия и распаковки всех файлов в каталоге / source / directory и быстрого перемещения их в каталог / dest / directory.Эта команда не находится в той же файловой системе, что и / source / directory и / dest / directory. Время будет показать особое преимущество.
Ниже приведены некоторые необычные способы использования:
n n>
make > compile.log 2> compile.log
Информация о стандартном выводе ошибок записывается в compile.log, но стандартный вывод отображается на экране. В это время информация об ошибке времени компиляции не отображается на экране, и эта информация будет записана в compile.log;
make 1> compile.log
Информация стандартного вывода записывается в compile.log, но стандартный вывод ошибок отображается на экране. В это время правильная информация во время компиляции не отображается на экране, и информация будет записана в compile.log.
echo «pls enter the para» >https://russianblogs.com/article/35331498181/» target=»_blank»]russianblogs.com[/mask_link]
Как запускать и контролировать фоновые процессы в Linux
Используйте оболочку Bash в Linux для управления процессами переднего плана и фоновыми процессами. Вы можете использовать функции и сигналы управления заданиями Bash, чтобы дать вам больше гибкости при выполнении команд. Мы покажем вам, как это сделать.
Все о процессах
Всякий раз, когда программа выполняется в Linux или Unix-подобной операционной системе, запускается процесс. «Процесс» — это имя внутреннего представления исполняемой программы в памяти компьютера. Для каждой активной программы есть свой процесс. Фактически, существует процесс почти для всего, что работает на вашем компьютере. Это включает в себя компоненты вашего графическая среда рабочего стола (GDE) такие как ГНОМ или же KDE, и система демоны которые запускаются при запуске.
Почему почти все, что работает? Ну, встроенные модули Bash, такие как CD, pwd, и псевдоним не нужно запускать (или «порождать») процесс при их запуске. Bash выполняет эти команды в экземпляре оболочки Bash, запущенной в окне вашего терминала. Эти команды бывают быстрыми именно потому, что для их выполнения не требуется запускать процесс. (Вы можете ввести help в окне терминала, чтобы увидеть список встроенных модулей Bash.)
Процессы могут выполняться на переднем плане, и в этом случае они берут на себя ваш терминал, пока они не будут завершены, или они могут выполняться в фоновом режиме. Процессы, которые выполняются в фоновом режиме, не доминируют в окне терминала, и вы можете продолжать работать в нем. Или, по крайней мере, они не доминируют в окне терминала, если не генерируют вывод на экран.
Грязный пример
Начнем простой пинг трассировка работает. Мы собираемся проверить домен toadmin.ru. Это будет выполняться как процесс переднего плана.
ping www.howtogeek.com
Получаем ожидаемые результаты, прокручивая окно терминала вниз. Во время работы ping мы больше ничего не можем делать в окне терминала. Чтобы завершить команду, нажмите Ctrl + C.
Ctrl+C
Видимый эффект Ctrl + C выделен на скриншоте. ping дает краткую сводку, а затем останавливается.
Повторим это. Но на этот раз мы нажмем Ctrl + Z вместо Ctrl + C. Задача не будет завершена. Это станет фоновой задачей. Мы получаем возвращенный нам контроль над окном терминала.
ping www.howtogeek.com
Ctrl+Z
Видимый эффект нажатия Ctrl + Z выделен на скриншоте.
На этот раз нам говорят, что процесс остановлен. Остановлено не означает прекращено. Это как машина на знаке остановки. Мы его не утилизировали и не выбросили. Он все еще в дороге, неподвижен, ждет своего часа.
Теперь процесс выполняется в фоновом режиме.
Команда вакансий перечислит вакансии которые были запущены в текущем терминальном сеансе. А поскольку задания (неизбежно) являются процессами, мы также можем использовать команду ps для их просмотра. Давайте воспользуемся обеими командами и сравним их результаты. Мы будем использовать опцию T (терминал) только для вывода списка процессов, запущенных в этом окне терминала. Обратите внимание, что использовать дефис не нужно — с параметром T.
jobs
ps T
Команда jobs сообщает нам:
Как изменить размер тома LVM в Linux
[1]: Число в квадратных скобках — это номер задания. Мы можем использовать это для ссылки на задание, когда нам нужно управлять им с помощью команд управления заданием.
+: Знак плюса + показывает, что это задание, которое будет выполняться, если мы используем команду управления заданием без конкретного номера задания. Это называется заданием по умолчанию. Заданием по умолчанию всегда является последнее, добавленное в список заданий.
Остановлен: процесс не запущен.
ping www.howtogeek.com: Командная строка, запустившая процесс.
Команда ps сообщает нам:
PID: идентификатор процесса. У каждого процесса есть уникальный идентификатор.
TTY: псевдотелетайп (окно терминала), из которого был выполнен процесс.
СТАТИСТИКА: статус процесса.
ВРЕМЯ: количество процессорного времени, потребляемого процессом.
КОМАНДА: команда, запустившая процесс.
Это общие значения для столбца STAT:
Д: Непрерывный сон. Процесс находится в состоянии ожидания, обычно ожидая ввода или вывода, и не может быть прерван.
I: холостой ход.
Р: Бег.
СУБЪЕКТ: Непрерывный сон.
T: Остановлен сигналом управления заданием.
З: Зомби-процесс. Процесс был остановлен, но не был «очищен» родительским процессом.
За значением в столбце STAT может следовать один из этих дополнительных индикаторов: