Чи можу я перенаправити вихід у файл журналу та одночасно підключити процес?


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 і переміщує його у файл.
І навпаки, він переміщує stdout до 1008, а потім переміщує stderr до точки, на яку stdout вказує, також 1008. Таким чином обидва можуть вказувати на один файл.


не здається захопити під після цього, хоча з$!
— chovy

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

14

Зупинення <Ctrl+Z>та продовження у фоновому режимі з bgеквівалентним виконанню &в кінці команди.

Отже, для запуску у фоновому режимі та переадресації:

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

Якщо вам також потрібно, щоб ця команда не загинула, поки виходите з терміналу, тоді вам слід скористатися nohup


О Я бачу. Ви кажете, що доданий знак "&" є зайвим?
— djangofan

Я просто цитую manpage. Оскільки nohup виконує команду у фоновому режимі все одно, видається зайвим виконувати сам
— nohup

10
nohup не виконує команду у фоновому режимі, ви повинні явно додати&
— jlliagre

3
Після того, як ви перемістили процес на другий план за допомогою bg, ви можете від'єднати його від сеансу, запустивши disown, завдяки чому процес не загине при закритті терміналу.
— Коен.

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

Зауважте, що &>спрямовує і stdout, і stderr на output.log


3
Однорядкове пояснення зробить відповідь повною.
— anaik

2
@ abhisheknaik96 запускає jar файл і перенаправляє і stdin, і stderr до output.log і робить його фоновим процесом.
— П Панг

2

Замість використання nohup ви можете використовувати екран. Ви можете переглянути статус програми в режимі реального часу. Ви навіть можете записати весь вихід у файл. Це корисно, коли ви отримуєте доступ до сервера через ssh, де ви виходите з системи через поганий зв’язок або бездіяльність. Після входу ви можете продовжити роботу з того місця, де ви поїхали. Повідомте це та це, щоб детально знати.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.