Динамическое вычисление значения переменной

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
nerve
Сообщения: 273
ОС: OpenBSD

Динамическое вычисление значения переменной

Сообщение nerve » 27.07.2015 11:01

что я хочу получить:
- в скрипте я задал переменную, которая проверяет ПИД
- далее я послал сигнал стоп этому пиду
- и теперь я хочу проверить заново ПИД - остановился процесс или нет
- но использовать ту же переменную я не могу, ведь она вычислилась сразу как только скрипт начал работать и соответственно вернет изначальный результат, до остановки процесса
вот наглядный пример:

Shell

$ cat test.sh #!/bin/sh D=`date` echo $D sleep 5 echo $D $ ./test.sh Mon Jul 27 10:56:53 EEST 2015 Mon Jul 27 10:56:53 EEST 2015

Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16115
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Динамическое вычисление значения переменной

Сообщение Bizdelnick » 27.07.2015 11:51

Что Вы подразумеваете под «переменной, которая проверяет ПИД»?
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
s.xbatob
Сообщения: 839
ОС: Fedora

Re: Динамическое вычисление значения переменной

Сообщение s.xbatob » 27.07.2015 12:16

Переменные для того и существуют, чтобы что-то сохранять. Хотите динамические данные - используйте функцию

А насчёт pid я, сказать честно, ваши намерения совсем не понял. И сигнал вы выбрали неподходящий.
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 273
ОС: OpenBSD

Re: Динамическое вычисление значения переменной

Сообщение nerve » 27.07.2015 12:20

Код: Выделить всё

#!/bin/sh
STOP=`\etc\init.d\service stop`
PID=`ps aux | grep java | grep service | awk '{print $2}'`

backup () {
mysqldump -ususer -p'pass' > $NAME
}

if [ -z $PID ]
  then
    backup
  else
    $STOP
    sleep 15
    if [-z $PID]
      then
    backup
      else
    echo "Something wrong. Unable to stop service"
    fi
fi
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16115
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Динамическое вычисление значения переменной

Сообщение Bizdelnick » 27.07.2015 12:34

Команда извлечения PID'а у Вас крайне сомнительная. Тем более что если речь о системном сервисе, его PID должен храниться в pid-файле, откуда его лучше всего и взять. При этом надо проверить, что команда, соответствующая этому PID, действительно та, которой запускается сервис, потому что он мог тихо умереть, а его PID получить другой процесс.
А первоначальный вопрос я так и не понял. PID процесса не меняется. Если хотите повторно использовать сохранённое в переменной значение — используйте, только, возможно, надо будет повторить проверку команды запуска процесса.
Отправки сигналов вообще не вижу. Причём они тут?
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
s.xbatob
Сообщения: 839
ОС: Fedora

Re: Динамическое вычисление значения переменной

Сообщение s.xbatob » 27.07.2015 12:53

Код: Выделить всё

PID=`ps aux | grep java | grep service | awk '{print $2}'`
[ "$PID" ] || {
# его и не было
}

....

if kill -0 "$PID"
then
# процесс жив
else
# умер
fi

Всё равно достаточно через жопу, но с SYSV init лучше особо и не сделать. Изучайте systemd :-)

Кстати, а зачем для бекапирования БД вообще что-либо останавливать?
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 273
ОС: OpenBSD

Re: Динамическое вычисление значения переменной

Сообщение nerve » 27.07.2015 13:03

Shell

$ cat test.sh #!/bin/sh echo "123" > test.file PID=`cat test.file` echo $PID echo "456" > test.file echo $PID $ ./test.sh 123 123 $ cat test.file 456


может я не правильно выражаюсь?
вместо второй раз "123" я ожидаю получить "456"
если переменная для этого не подходит, тогда что нужно использовать?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16115
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Динамическое вычисление значения переменной

Сообщение Bizdelnick » 27.07.2015 13:07

s.xbatob писал(а):
27.07.2015 12:53
с SYSV init лучше особо и не сделать. Изучайте systemd

А почему Вы думаете, что там sysvinit?
nerve писал(а):
27.07.2015 11:01
ОС: OpenBSD


s.xbatob писал(а):
27.07.2015 12:53
зачем для бекапирования БД вообще что-либо останавливать?

Присоединяюсь к вопросу.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 273
ОС: OpenBSD

Re: Динамическое вычисление значения переменной

Сообщение nerve » 27.07.2015 13:11

Bizdelnick писал(а):
27.07.2015 13:07
s.xbatob писал(а):
27.07.2015 12:53
зачем для бекапирования БД вообще что-либо останавливать?

Присоединяюсь к вопросу.

To avoid any data inconsistency and corruption, it is recommended to shut down Confluence before creating a database backup or dump.
проверить что сервис работает или не работает, остановить, проверить что остановился, сделать бекап, запустить.

Bizdelnick писал(а):
27.07.2015 13:07
А почему Вы думаете, что там sysvinit?
nerve писал(а):
27.07.2015 11:01
ОС: OpenBSD


CentOS 6.3
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16115
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Динамическое вычисление значения переменной

Сообщение Bizdelnick » 27.07.2015 13:34

nerve писал(а):
27.07.2015 13:11
To avoid any data inconsistency and corruption, it is recommended to shut down Confluence before creating a database backup or dump.

Ну так это рекомендация для сферической СУБД в вакууме. Почему бы вместо остановки сервиса не залочить таблицы?
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 273
ОС: OpenBSD

Re: Динамическое вычисление значения переменной

Сообщение nerve » 27.07.2015 13:48

ну это уже вопрос реализации, вдруг в момент лока процесс захочет что-то записать в БД. какова будет реакция процесса и не свалится ли он - это еще надо выяснить. видимо отсюда и сферическая рекомендация - остановить, а потом дампить, чтоб было наверняка.
s.xbatob писал(а):
27.07.2015 12:16
Переменные для того и существуют, чтобы что-то сохранять. Хотите динамические данные - используйте функцию

спасибо, видимо это то, в чем я хотел разобраться.

Shell

$ cat test.sh #!/bin/sh pid () { cat test.file } echo "123" > test.file pid echo "456" > test.file pid $ ./test.sh 123 456

Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16115
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Динамическое вычисление значения переменной

Сообщение Bizdelnick » 27.07.2015 14:07

Процесс не должен валиться не то что при локе таблиц, а и при потере связи с СУБД. Если не хочется лочить — есть опция --single-transaction. А можно с реплики бекап делать... Вообще для «горячего» бекапа БД столько всего напридумывали, что ей-ей крайне странно останавливать ради этого какой-то сервис (да ещё и жабописаный, который потом, небось, полчаса стартует).
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
s.xbatob
Сообщения: 839
ОС: Fedora

Re: Динамическое вычисление значения переменной

Сообщение s.xbatob » 27.07.2015 14:16

nerve писал(а):
27.07.2015 13:48
ну это уже вопрос реализации, вдруг в момент лока процесс захочет что-то записать в БД. какова будет реакция процесса и не свалится ли он - это еще надо выяснить. видимо отсюда и сферическая рекомендация - остановить, а потом дампить, чтоб было наверняка.

это одна из прямых обязанностей СУБД - разрешать подобные конфликты, так что ничего не развалится. Если, конечно, делать бекап штатными средствами, а не с помощью dd, так любимого многими.
Спасибо сказали: