Проблема со сценарием bash [дубликат]

На этот вопрос уже есть ответ здесь:

У меня небольшая проблема с моим скриптом. Я выполняю команду в фоновом режиме с помощью sudo и пытаюсь получить PID команды в переменной.

код следующий:

#!/bin/bash

sudo badblocks -o $2 $1 & 

PROCESSID=$(pgrep -P $!)

echo $PROCESSID

Я выполнил каждую команду одну за другой в оболочке, и все работает нормально, но когда я запускаю скрипт, он не работает. У меня есть другая команда для получения PID, например «ps --ppid $! -O pid =», но она тоже не работает.

если вы знаете почему?

0
задан 2 October 2014 в 04:29

2 ответа

Проблема

  • Используя 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.

2
ответ дан 4 August 2019 в 23:40

Предположение...

, Если каждая команда работает независимо, могло бы случиться так, что присвоение PROCESSID происходит слишком быстро.

Попытка, добавляющая 'сон, 3 с' после 'sudo...' и видят то, что происходит.

0
ответ дан 4 August 2019 в 23:40

Другие вопросы по тегам:

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