Upstart job: запускать задачу один раз за событие

Я немного сбит с толку относительно того, как начинаются работы в событиях Upstart. Чтобы проиллюстрировать мое недоразумение, у меня есть четыре задания Upstart, которые выглядят следующим образом:

Задание 1:

start on local-filesystems

task

script
    echo "job 1 ran" >> /tmp/job1
end script

Задание 2:

start on (local-filesystems and net-device-added)

task

script
    echo "job 2 ran" >> /tmp/job2
end script

Задание 3: [ 1115]

start on (local-filesystems and bluetooth-device-added)

task

script
    echo "job 3 ran" >> /tmp/job3
end script

Задание 4:

start on local-filesystems or (local-filesystems and net-device-added) or (local-filesystems and bluetooth-device-added)

task

script
    echo "job 4 ran" >> /tmp/job4
end script

Я ожидаю следующее содержимое файла после перезагрузки:

/ tmp / job1:

job 1 ran

/ tmp / job2

job 2 ran

/ tmp / job3

job 3 ran

/ tmp / job4

job 4 ran
job 4 ran
job 4 ran

Я ожидаю, что задание 4 будет выполнено три раза, потому что оно может быть запущен тремя отдельными наборами событий, все из которых происходят, как доказано другими заданиями. Но мои ожидания неверны; файлы на самом деле содержат следующее:

/ tmp / job1:

job 1 ran

/ tmp / job2

job 2 ran

/ tmp / job3

job 3 ran

/ tmp / job4

job 4 ran

Почему job4 запускается только один раз, даже если происходят все три набора событий? Есть ли какой-нибудь способ добиться поведения при выполнении этого задания всякий раз, когда возникает какой-либо из сигналов, независимо от того, сколько раз задание фактически выполняется? Если это поможет, я отредактировал его, чтобы распечатать переменную $ UPSTART_EVENTS, чтобы увидеть, какие события вызывают задание 4, и его локальные файловые системы.

Подводя итог: я хотел бы, чтобы задание 4 выполнялось для события local-filesystems, и AND для события добавления сетевого устройства (при условии, что также произошло local_filesystems), и AND для события добавления bluetooth-устройства ( пока local_filesystems произошла). Как мне это сделать?

Спасибо!

1
задан 28 November 2012 в 04:29

3 ответа

start on Изменяет только цель задания, начиная с остановки. Если задание уже находится в start, задание не фиксируется и ничего не делает при включенных событиях.

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

instance $UPSTART_EVENTS

При этом выскочке будет запускаться экземпляр задания для каждой пары событий, которая соответствует в start on. [ 116]

0
ответ дан 28 November 2012 в 04:29

Очевидное, хотя и не элегантное решение состоит в том, чтобы создать 3 различных новых рабочих места. Вы бы просто использовали задания 1-3, которые вы создали выше. Я изучил это на виртуальной машине, и это лучшее, что я мог придумать. У кого-то есть более элегантное решение, которое я хотел бы увидеть.

0
ответ дан 28 November 2012 в 04:29

Ответ довольно прост: вы не можете отвечать на несколько событий, если задание уже выполняется от имени любого из этих условий . Upstart не записывает и не воспроизводит события. Если ваша работа выполняется из-за события A и запускается событие A, происходит событие B, на которое указанное задание также может реагировать. Не существует очереди, которая сохранит событие B и воспроизведет его для каждого задания, которое ранее выполнялось для повторной оценки указанного события. В конце концов, это init, и цель сценариев init - запускать его один раз.

Загрузочная диаграмма с готовностью покажет, какие сигналы испускаются одновременно.

Вы можете убедиться в этом сами, настроив свою работу на реагирование на событие, сделав так, чтобы она выполняла что-то простое, например, спящий режим 30 с, а затем, пока работа выполняется, испускает другое событие (initctl emit foo). Как только задание будет завершено в первый раз, оно не запустится снова.

«Подводя итог: я хотел бы, чтобы задание 4 выполнялось для события local-filesystems, и AND для события добавления сетевого устройства (при условии, что также произошло local_filesystems), и AND для события добавления bluetooth-устройства (до тех пор, пока local_filesystems произошла). Как мне это сделать? "

http://upstart.ubuntu.com/cookbook/#starting-a-job

На самом деле это довольно четко прописано в таком условном исполнении. Это не значит, однако, что он будет работать более одного раза. Вы можете пересмотреть решение этой проблемы для начала.

0
ответ дан 28 November 2012 в 04:29

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

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