Могу ли я перенаправить вывод в файл журнала и одновременно запустить процесс в фоновом режиме?
Другими словами, могу ли я сделать что-то подобное?
nohup java -jar myProgram.jar 2>&1 > output.log &
Или это не законная команда? Или мне нужно вручную переместить его на задний план, например так:
java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
bash
shell
shell-script
djangofan
источник
источник
2>$1
вероятно, должно быть2>&1
.Ответы:
Одна из проблем с вашей первой командой заключается в том, что вы перенаправляете stderr туда, где находится stdout (если вы изменили $ на a &, как предложено в комментарии), а затем вы перенаправили stdout в какой-то файл журнала, но это не приводит к перенаправленному stderr. , Вы должны сделать это в другом порядке, сначала отправьте stdout туда, куда вы хотите, а затем отправьте stderr по адресу stdout по адресу
а затем вы можете добавить & на, чтобы отправить его на задний план. Рабочие места можно получить с помощью
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. Таким образом, оба могут указывать на один файл.
источник
$!
&> file.out
для перенаправления как stdin, так и stdout в выходной файл, что сокращает вероятность ошибки при вводе2>&1
неправильного места в вашей командной строке.Остановка с помощью
<Ctrl+Z>
и продолжение в фоновом режимеbg
эквивалентна выполнению с помощью команды&
в конце.Итак, для запуска в фоновом режиме и перенаправления вывода:
Если вам также нужно, чтобы эта команда не умерла, когда вы выходите из терминала, вам следует использовать
nohup
источник
&
bg
, вы можете отсоединить его от сеанса, запустив егоdisown
, что делает процесс не умирающим при закрытии терминала.Обратите внимание, что
&>
направляет как stdout и stderr в output.logисточник
Вместо использования nohup вы можете использовать экран. Вы можете просматривать статус программы в режиме реального времени. Вы даже можете записать весь вывод в файл. Это полезно при доступе к серверу через ssh, где вы вышли из системы из-за плохого соединения или неактивности. После входа в систему вы можете продолжить работу с того места, где вы ушли. обратитесь это и это, чтобы узнать подробно.
источник
Команда
tee
тоже довольно распространена.nohup java -jar myProgram.jar | tee output.log &
источник