Оригинальная версия:

Как запустить sudo sh -c "command" на заднем плане

В терминале

sudo sh -c "команда" & запускается в фоновом режиме, но как только я нажимаю enter, процесс завершается

[test@localhost app]$ sudo sh -c 'app start' &                        
[3] 31725 

[test@locahost app]$

[3]+  Stopped                 sudo sh -c 'app start'

Перепишите:

Я хочу запустить some long-running command в фоновом режиме, как root.  «Очевидный» способ сделать это

sudo some long-running command &

По неуказанным причинам я тоже пытался

sudo sh -c 'some long-running command' &

Обе эти ошибки завершаются одинаково: я получаю приглашение оболочки, но затем, как только я нажимаю Enter, я получаю сообщение об ошибке:

$ sudo sh -c 'some long-running command' &
 [3] 31725

$

[3]+ Stopped sudo sh -c 'some long-running command'
$ 

Мне было указано, что когда я помещаю команду sudo в фоновый режим, она теряет доступ к стандартному вводу.  Поэтому он не может прочитать пароль и останавливается при попытке.

Другой подход - использовать опцию -b чтобы указать sudo перевести long-running command в фоновый режим, а не sudo в фоновый:

sudo -b some long-running command

или же

sudo -b sh -c 'some long-running command'

Ой!  Я почти забыл упомянуть!  Мои требования включают

  • Должен быть в состоянии перенаправить вывод long-running command в файл.
  • Должен иметь возможность фиксировать состояние завершения long-running command, предположительно записывая ее в файл.
  • Должно быть в состоянии получить PID фонового процесса в каком - то надежном способе (без необходимости grep через выход ps

Как я могу это сделать?

2 ответа2

1
  1. Прежде всего, процесс не завершается; это останавливается.  Есть разница.
  2. Во-вторых, это, вероятно, происходит немедленно; вы просто не получите уведомление, пока не нажмете Enter.
  3. В-третьих, когда вы помещаете команду в фоновый режим (с помощью &), она переводит стандартный ввод в специальное состояние, чтобы фоновые процессы не могли читать с клавиатуры.  Когда вы помещаете sudo в фоновый режим, он не может прочитать пароль, и поэтому он останавливается.
  4. Исправьте это, сказав sudo поместить команду в фоновый режим (вместо того, чтобы указывать вашей оболочке входа в систему поместить sudo в фоновый режим):

    sudo -b sh -c 'app start'
    
  5. Для такой простой команды, как "запуск приложения", очевидной необходимости в sh -c .  Пытаться

    sudo -b 'app start'
    

PS Этот вопрос действительно не имеет ничего общего с sh -c .  Вы бы имели такую же проблему с чем-то вроде

sudo sleep 42 &
0

Вот несколько подходов:

sudo sh -c '(some long-running command > out.txt; echo $? > ret.txt)& echo $!'

а также

sudo -b sh -c 'echo $$ > pid.txt; some long-running command > out.txt; echo $? > ret.txt'

Немного более хитрый подход:  

sudo sleep 0
sudo sh -c 'echo $$ > pid.txt; some long-running command > out.txt; echo $? > ret.txt' &

где sudo sleep 0 запрашивает ваш пароль и кэширует ваши учетные данные, поэтому следующая команда sudo может выполняться без запроса пароля.

Все они дают вам PID процесса sh -c а не long-running command процесс.

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