Сценарий Bash для передачи сигналов об одновременно рабочем экземпляре (тот же сценарий) об условии и инкрементном счетчике

Вещи попробовать.

1. Путь существует?

Я знаю, что это звучит глупым, но удостоверьтесь что каталог /apachelogs/data существует. Также удостоверьтесь, что файл существует, /apachelogs/data/file и это у Вас есть полномочия управлять им.

2. Попробуйте команды от оболочки

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

Пример

Попробуйте следующее:

$ cd /apachelogs/data
$ touch foobar

Теперь добавьте расширенный атрибут:

$ setfattr -n user.foo -v bar foobar
$ getfattr -d foobar
# file: foobar
user.foo="bar"

Ссылки

2
27.02.2014, 21:10
2 ответа

man bash:

Если bash ожидает завершения команды и получает сигнал, для которого установлена ловушка, ловушка не будет выполнена до завершения команды. Когда bash ожидает асинхронную команду с помощью встроенной функции wait, получение сигнала, для которого была установлена ловушка, заставит встроенную функцию wait немедленно вернуться со статусом выхода больше 128, сразу после чего ловушка будет выполнена.

Вместо этого сделайте sleep 100 и дождитесь его завершения. Однако я не знаю, обрабатываются ли несколько сигналов несколько раз.

3
27.01.2020, 22:06

Вы можете передать счетчик длительному заданию двумя основными способами:

  1. Общий счетчик, защищенный второй блокировкой; или
  2. Набор счетчиков, не используемых совместно, которые объединяются долгим заданием.

Общий счетчик достаточно прост:

if (set -o noclobber; echo $$ > /tmp/grumpy-waiters.lock); then
  echo >> /tmp/grumpy-waiters
  rm -f /tmp/grumpy-waiters.lock
fi

Затем длительное задание может считывать счетчик следующим образом:

num_grumpy_waiters=0
if [ -s /tmp/grumpy-waiters ]; then
  num_grumpy_waiters=$(wc -c < /tmp/grumpy-waiters)
fi

Подход с неразделенным сбором включает создание нескольких файлов без необходимости блокировки. Это менее рискованно, но более сложно. Каждый отказавший экземпляр создает или обновляет свой собственный счетчик:

grumpy_shard=1
if [ -s /tmp/grumpy.${LOCKPID}.$$ ]; then
  grumpy_shard=$(expr $(cat /tmp/grumpy.${LOCKPID}.$$) + 1)
fi
echo ${grumpy_shard} > /tmp/grumpy.${LOCKPID}.$$

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

num_grumpy_waiters=$(cat /tmp/grumpy.$$.* 2>/dev/null | awk 'BEGIN{s=0}NF>0{s=s+int($1)}END{print s}')
rm -f /tmp/grumpy.$$.* 2>/dev/null

В любом случае, использование сигналов для прерывания сценария оболочки победило ' t вызвать своевременное прерывание. Если вам это нужно, то скрипт должен включить слушателя в свой собственный фон, чтобы он мог немедленно реагировать на сигнал.

0
27.01.2020, 22:06

Теги

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