CoreOS: запускать собственный сценарий только один раз во время загрузки

Вы можете использовать find с флагом временной метки, чтобы он подбирал все файлы с момента последнего запуска, независимо от того, как давно это было. Не стесняйтесь заменить определение $trigger на что-то более подходящее.

trigger=/tmp/trigger

touch "$trigger.new"
test ! -f "$trigger" && touch "$trigger"

find /a/b/c -newer "$trigger" -type f -exec cp -f {} /x/y/z +
mv -f "$trigger.new" "$trigger"

Это все равно не сработает в ситуациях, когда mtime сбрасывается после того, как файл был полностью записан.

Он также не сработает, если во время выполнения этого кода происходит запись исходного файла. Стоит защититься от этого сценария, если только вы не можете гарантировать, что ваши исходные файлы появляются атомарно. Одним из способов решения этой проблемы является запись ваших файлов с суффиксом .tmp (или .part) и переименование их отправителем только после завершения работы. find в этом триггерном сценарии будет изменен, чтобы исключить файлы, имена которых заканчиваются на .tmp (или .part).

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

rsync -a /a/b/c/ /x/y/z/
1
24.05.2018, 10:02
2 ответа

Lo más sencillo para lograr esto es crear en /etc/crontabsiguiente tarea:

@reboot /path/to/your/python/script.sh

Puede obtener más información de man 5 crontab .

CoreOS no tiene /etc/crontab.


Otra forma es crear systemd -timer . Ejemplo sobre el temporizador systemd -que puede obtener de mi respuesta sobre systemd:Use systemd -shutdownd schedule .

Ejemplo simple del temporizador systemd -que se encuentra en/etc/systemd/system/example.timer:

[Unit]
Description=Run once at system boot

[Timer]
# You may chose one of this triggers
OnBootSec=0min # run after system boot
OnStartupSec=0min # run after systemd was started

[Install]
WantedBy=timers.target # target in wich timer will be installed
3
27.01.2020, 23:43

Usar Systemd es la forma más natural y mejor de hacerlo:

Debe crear una unidad para su servicio en/etc/systemd/system/yourservice.service

[Unit]
Description=your service name

[Service]
Type=oneshot #or simple
ExecStart=/path/to/your/script.py

[Install]
WantedBy=multi-user.target

Para permitir que el servicio se ejecute en el arranque, debe ejecutarsudo systemctl enable yourservice.service(agregar el indicador --nowpara iniciar el script de inmediato)

No proporciona mucha información, pero hay muchas otras opciones que puede usar en el archivo de la unidad. Consulte man systemd.servicey man systemd.unitpara obtener más información.

Aquí también hay un enlace a los documentos de CoreOS:Primeros pasos con systemd

1
27.01.2020, 23:43

Теги

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