Если вы хотите запустить скрипт только один раз для каждого каталога, содержащего хотя бы один соответствующий 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
, он все же может быть более эффективным в зависимости от количества лишних данных, в которые он в конечном итоге будет входить.
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.
Не знаю, актуален ли еще ответ для вас, но я все равно хотел оставить его здесь.
Я полагаю, что ваша проблема связана с этапом установки и файлами пакета. Я вижу, вы пытались установить службу в папку, но это не работает с 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"
Надеюсь, это поможет вам или кому-то еще:)