Рецепт Yocto для службы systemd USER

Если вы хотите запустить скрипт только один раз для каждого каталога, содержащего хотя бы один соответствующий outфайл, и не запускать по одному grepфайлу, вы можете выполнить:

P="pattern" find. -name '*.out' -type f -exec gawk '
  BEGINFILE {
    dir = FILENAME; sub("/[^/]*$", "", dir)
    if (dir in found) nextfile
  }
  $0 ~ ENVIRON["P"] {
    printf "%s\0", dir
    found[dir]
    nextfile
  }' {} + | xargs -r0 sh -c '
    for dir do
      (cd "$dir" && exec somescript.sh)
    done' sh

Это позволит запустить как можно меньше процессов и gawkпрочитать как можно меньше файлов (и как можно меньше каждого файла ).

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

С одним вызовом GNU grep(и GNU dirname, sort,xargs):

grep -rlZ --include='*.out' pattern. |
  xargs -r0 dirname -z |
  sort -zu |
  xargs -r0 sh -c '
    for dir do
      (cd "$dir" && exec somescript.sh)
    done' sh

В отличие от предыдущего решения, это будет искать во всех outфайлах, даже в тех каталогах, где уже были найдены соответствующие файлы. Поскольку GNU grepболее эффективен при поиске, чем gawk, он все же может быть более эффективным в зависимости от количества лишних данных, в которые он в конечном итоге будет входить.

1
26.05.2020, 13:45
2 ответа

systemd.bbclass заботится только о системных службах, а не о пользовательских службах.

Я думаю, вы должны сделать что-то вроде этого:

Удалить переменную SYSTEMD _SERVICE _${PN}

FILES_${PN} += "${systemd_user_unitdir}"

pkg_postinst_${PN} () {
    #!/bin/sh -e
    OPTS=""
    if [ -n "$D" ]; then
        OPTS="--root=$D"
    fi
    systemctl ${OPTS} --user enable mediumlevel.service
}

Возможно, вам нужно удалить даже строку inherit systemd, потому что класс устанавливает pkg _postinst.

1
18.03.2021, 23:32

Не знаю, актуален ли еще ответ для вас, но я все равно хотел оставить его здесь.

Я полагаю, что ваша проблема связана с этапом установки и файлами пакета. Я вижу, вы пытались установить службу в папку, но это не работает с Yocto. Вам необходимо указать имя файла вместе с папкой. То же самое в ФАЙЛЕ _${PN}. Этот рецепт должен работать лучше:

SUMMARY = "Launch mediumlevel at boot"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

inherit systemd

SRC_URI = "file://mediumlevel.service \
"

S = "${WORKDIR}"

SYSTEMD_SERVICE_${PN} = "mediumlevel.service"

do_install() {
        install -d ${D}${systemd_user_unitdir}
        install -m 0644 ${WORKDIR}/mediumlevel.service ${D}${systemd_user_unitdir}/mediumlevel.service
}

FILES_${PN} += "${systemd_user_unitdir}/mediumlevel.service"

REQUESTED_DISTRO_FEATURES = "systems"

Надеюсь, это поможет вам или кому-то еще:)

1
18.03.2021, 23:32

Теги

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