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


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.