Я недавно запустил jboss в фоновом режиме в Linux и увидел, что если вы выполните команду следующим образом:

nohup ./startjboss.sh > server.log &

Выход:

[1] 18835
[root@cnt5-01b downloads]#

Терминал для следующей команды появляется непосредственно.

Однако, если я запускаю команду следующим образом:

nohup ./startjboss.sh & > server.log

Тогда вывод:

[1] 19223
[root@cnt5-01b downloads]# nohup: appending output to `nohup.out'

Затем, когда я нажимаю Enter, он возвращается к:

[root@cnt5-01b downloads]#

это терминал, где я могу написать следующую команду.

Почему есть разница в поведении (необходим дополнительный ввод)? Это очень маленькая вещь, даже не проблема; но я просто хочу знать.

2 ответа2

1

Когда вы помещаете &, вы говорите оболочке запустить то, что предшествует ей в фоновом режиме, и продолжить с новой командой.

Когда вы помещаете его в конец строки, после него нет команды, поэтому оболочка возвращается в интерактивный режим.

Когда вы помещаете его посередине, оболочка интерпретирует оставшуюся часть строки как новую команду. Эта команда перенаправляет стандартный вывод ничего в server.log. Поскольку вы не перенаправляете вывод nohup, теперь вы видите его в терминале. Поскольку оболочка уже перерисовывала свой PS1 раньше, вы видите эту строку вывода, как если бы она была командой, но это просто вывод из фонового задания. Вы можете набрать новую команду, даже не нажимая Enter ранее (хотя это не так ясно, когда вы читаете ее позже).

0

Ну, в общем, когда вы запускаете команду с & после нее, вы теряете некоторую функциональность.

Возьмите это как пример, создайте скрипт, который ничего не делает, кроме как возвращает 2, например.

  • запустить скрипт нормально, выдать echo $? и вы увидите вывод 2 .
  • запустите скрипт с & после него, запустите echo $? и вы увидите вывод 0 .

Кроме того, при запуске nohup ./startjboss.sh & > server.log , если вы проверите файл server.log , вы увидите, что он пуст, потому что на выходе вашего фонового процесса будет 0 при успешном завершении, а потому вы не echo его в server.log так что ничего не будет на самом деле написано в server.log

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .