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

116

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

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

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

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

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
djangofan
источник
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

RSFalcon7
источник
А ну понятно. Вы говорите, что добавленный символ '&' является избыточным?
Джангофан
Я просто цитирую справочную страницу. Так как 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, где вы вышли из системы из-за плохого соединения или неактивности. После входа в систему вы можете продолжить работу с того места, где вы ушли. обратитесь это и это, чтобы узнать подробно.

Mani
источник
1

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

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

trevorgrayson
источник