Могу ли я перенаправить вывод в файл журнала и одновременно запустить процесс в фоновом режиме?


116

Могу ли я перенаправить вывод в файл журнала и одновременно запустить процесс в фоновом режиме?

Другими словами, могу ли я сделать что-то подобное?

nohup java -jar myProgram.jar 2>&1 > output.log &

Или это не законная команда? Или мне нужно вручную переместить его на задний план, например так:

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1

2
Ты это пробовал? Какая у вас ошибка? Также я не уверен, что у вас есть опечатка или ошибка в вашем коде. 2>$1вероятно, должно быть 2>&1.
Патрик

Ответы:


171

Одна из проблем с вашей первой командой заключается в том, что вы перенаправляете stderr туда, где находится stdout (если вы изменили $ на a &, как предложено в комментарии), а затем вы перенаправили stdout в какой-то файл журнала, но это не приводит к перенаправленному stderr. , Вы должны сделать это в другом порядке, сначала отправьте stdout туда, куда вы хотите, а затем отправьте stderr по адресу stdout по адресу

some_cmd > some_file 2>&1 &

а затем вы можете добавить & на, чтобы отправить его на задний план. Рабочие места можно получить с помощью jobsкоманды. jobsпокажет вам текущие работы, и пронумеровать их. Затем вы можете говорить о заданиях, используя%, за которым следует число kill %1или около того.

Кроме того, без & в конце вы можете приостановить выполнение команды Ctrlz, используйте bgкоманду, чтобы поместить ее в фоновый режим и fgвернуть на передний план. В сочетании с jobsкомандой это мощно.

чтобы уточнить вышеприведенную часть о порядке написания команд. Предположим, что stderr - это адрес 1002, stdout - это адрес 1001, а файл - 1008. Команда читает слева направо, поэтому первое, что она видит в вашем файле 2>&1, это то, что перемещает stderr на адрес 1001, а затем видит, > fileкакой из них перемещает stdout на 1008, но сохраняет stderr на 1001. Он не тянет все, указывающее на 1001, и не перемещает его на 1008, а просто ссылается на stdout и перемещает его в файл.
С другой стороны, он перемещает стандартный вывод на 1008, а затем перемещает стандартный вывод на точку, на которую указывает стандартный вывод, также на 1008. Таким образом, оба могут указывать на один файл.


не могу захватить pid после этого, хотя с$!
chovy

8
Также стоит отметить: вы можете использовать &> file.outдля перенаправления как stdin, так и stdout в выходной файл, что сокращает вероятность ошибки при вводе 2>&1неправильного места в вашей командной строке.
Дан

14

Остановка с помощью <Ctrl+Z>и продолжение в фоновом режиме bgэквивалентна выполнению с помощью команды &в конце.

Итак, для запуска в фоновом режиме и перенаправления вывода:

java -jar myProgram.jar 2> errorOutput.log > output.log &

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


А ну понятно. Вы говорите, что добавленный символ '&' является избыточным?
Джангофан

Я просто цитирую справочную страницу. Так как nohup все равно будет выполнять команду в фоновом режиме, представляется излишним выполнять сам nohup в фоновом режиме
RSFalcon7

10
nohup не выполняет команду в фоновом режиме, вы должны явно добавить&
jlliagre

3
После того, как вы переместили процесс в фоновый режим bg, вы можете отсоединить его от сеанса, запустив его disown, что делает процесс не умирающим при закрытии терминала.
Коен.

14
java -jar myProgram.jar &> output.log &

Обратите внимание, что &>направляет как stdout и stderr в output.log


3
Объяснение в одну строку сделает ответ завершенным.
Анаик

2
@ abhisheknaik96 запускает файл jar, перенаправляет как stdin, так и stderr в файл output.log и делает его фоновым процессом.
P Pang

2

Вместо использования nohup вы можете использовать экран. Вы можете просматривать статус программы в режиме реального времени. Вы даже можете записать весь вывод в файл. Это полезно при доступе к серверу через ssh, где вы вышли из системы из-за плохого соединения или неактивности. После входа в систему вы можете продолжить работу с того места, где вы ушли. обратитесь это и это, чтобы узнать подробно.


1

Команда teeтоже довольно распространена.

nohup java -jar myProgram.jar | tee output.log &

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.