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

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

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

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

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

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

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

решение1

Одна из проблем с вашей первой командой заключается в том, что вы перенаправляете stderr туда, где находится stdout (если вы изменили $ на &, как предложено в комментарии), а затем вы перенаправляете 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>&1which перемещает stderr на адрес 1001, затем она видит > filewhich перемещает stdout на 1008, но сохраняет stderr на 1001. Она не извлекает все, что указывает на 1001, и не перемещает его на 1008, а просто ссылается на stdout и перемещает его в файл.
Наоборот, она перемещает stdout на 1008, а затем перемещает stderr в точку, на которую указывает stdout, также на 1008. Таким образом, обе могут указывать на один и тот же файл.

решение2

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

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

решение3

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

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

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

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

решение4

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

Связанный контент