На этот вопрос уже есть ответ здесь:
У меня небольшая проблема с моим скриптом. Я выполняю команду в фоновом режиме с помощью sudo и пытаюсь получить PID команды в переменной.
код следующий:
#!/bin/bash
sudo badblocks -o $2 $1 &
PROCESSID=$(pgrep -P $!)
echo $PROCESSID
Я выполнил каждую команду одну за другой в оболочке, и все работает нормально, но когда я запускаю скрипт, он не работает. У меня есть другая команда для получения PID, например «ps --ppid $! -O pid =», но она тоже не работает.
если вы знаете почему?
sudo
внутренняя часть, сценарий часто не делает то, что Вы ожидаете (см. ссылку Цифрового Chris: “ , Как я выполняю эту команду sudo в сценарии? ”). sudo
к фону не будет работать (правильно и надежно), если необходимо обеспечить пароль. Получают идентификатор процесса в процессе, порожденном sudo
. Если Вы используете exec
, Вы не должны даже использовать pgrep -P
в качестве опоры. Создайте сценарий оболочки, скажите pid-badblocks.sh
:
#!/bin/sh
echo $
exec badblocks -o "$2" "$1"
Делают его исполняемым файлом и вызывают его с:
sudo ./pid-badblocks.sh <DEVICE> <OUTPUT>
Это работает, потому что exec
замены текущий процесс с badblocks
(в этом случае) при хранении того же идентификатора процесса. Мы можем поэтому распечатать идентификатор процесса процесса оболочки прежде, чем вызов badblocks
.
Предположение...
, Если каждая команда работает независимо, могло бы случиться так, что присвоение PROCESSID происходит слишком быстро.
Попытка, добавляющая 'сон, 3 с' после 'sudo...' и видят то, что происходит.