![Можно ли перенаправить вывод в файл журнала и одновременно перевести процесс в фоновый режим?](https://rvso.com/image/31666/%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%BB%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%20%D0%B2%20%D1%84%D0%B0%D0%B9%D0%BB%20%D0%B6%D1%83%D1%80%D0%BD%D0%B0%D0%BB%D0%B0%20%D0%B8%20%D0%BE%D0%B4%D0%BD%D0%BE%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%B5%D1%81%D1%82%D0%B8%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%20%D0%B2%20%D1%84%D0%BE%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9%20%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%3F.png)
Можно ли перенаправить вывод в файл журнала и фоновый процесс одновременно?
Другими словами, могу ли я сделать что-то подобное?
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>&1
which перемещает stderr на адрес 1001, затем она видит > file
which перемещает 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, где вы выходите из системы из-за плохого соединения или бездействия. После входа вы можете продолжить работу с того места, где остановились. см.этотиэтотзнать подробно.