Поведение Linux немного отличается, если мы передадим '&' до перенаправления io '>' и после перенаправления

328
Gaurav Fotedar

Я недавно запустил 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]# 

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

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

0

2 ответа на вопрос

1
user2313067

When you place the &, you're telling the shell to run what precedes it in the background and continue with a new command.

When you put it at the end of the line, there's no command after so the shell returns to interactive mode.

When you place it in the middle, the shell interprets the rest of the line as a new command. That command redirects the standard output of nothing to server.log. Since you're not redirecting the output of nohup, you now see it on the terminal. Since the shell had already redrawn its PS1 before, you see that line of output as if it were a command, but it's simply output from a background job. You can type your new command without even pressing enter before (though it's not that clear when you read it later).

0
MoonDrop legacy

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

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

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

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

Похожие вопросы