Что-то подобное inotifywait, не имея возможности установить inotifywait.

Вопрос или проблема

Я хотел постоянно пересобирать и тестировать проекты, но только что обнаружил, что дистрибутив RHEL моей школы не включает inotify или inotifywait.

Есть ли какие-либо альтернативы, которые я мог бы использовать без необходимости использования sudo?

Я просто хочу автоматически пересобирать make при изменении файлов.

ИЗМЕНЕНИЕ: Я использую опрос вместо этого (что смешно, потому что я делаю это для курса по конкурентности), так что все, что лучше этого, было бы полезно.

watch:  
    while true; do \
        make | grep -v -e "Ничего не" -e "Вход" -e "Выход"; \
        sleep 1; \
    done

Хорошей альтернативой является fschange. Вы можете скачать исходный код по указанной ссылке и скомпилировать его сами.

Также есть dir_minotor (например, смотрите эту веб-страницу для получения дополнительной информации), кроссплатформенное решение на C++. Я никогда его не использовал, просто сохранил ссылку на ‘возможное будущее использование.

Что касается inotify, я не использую RHEL, поэтому не в своем элементе, но вы уверены, что это должно быть в репозиториях? Оно реализовано в ядре, а не как пакет репозитория. Вы можете попробовать установить inotify-tools и посмотреть, действительно ли ваше ядро поддерживает inotify. Вы можете сделать это даже, если у вас нет доступа к sudo:

Скачайте исходный код локально (т.е. на /home/your_name), скомпилируйте его, установите в /home/your_name/bin, запустите его на своих собственных файлах локально. Вот что я делал, когда я был скромным студентом, я не пробовал это с inotify-tools, но это должно быть абсолютно выполнимо.

Вы можете использовать юнит пути systemd для мониторинга файла или директории. Пользовательский экземпляр systemd не потребует прав root, и его не нужно активировать по умолчанию на RHEL. Используйте systemctl --user для выполнения команд и /usr/lib/systemd/user/ для добавления ваших юнитов, например, projectrebuild.path и projectrebuild.service:

[Unit]
Description="Мониторить мои проектные файлы и пересобирать, если произойдут изменения"

[Path]
PathModified=/some/path/to/monitor
Unit=projectrebuild.service

[Install]
WantedBy=default.target
[Unit]
Description="Пересобрать проект"

[Service]
Type=oneshot
ExecStart=/path/to/build/script
systemctl --user enable --now projectrebuild.path

Ответ или решение

Вам нужно реализовать автоматическую компиляцию вашего проекта при изменении файлов, но ваша RHEL (Red Hat Enterprise Linux) установка не поддерживает inotify или inotifywait. Вы не имеете прав администратора для установки новых инструментов, но всё же доступны некоторые альтернативные решения.

1. Использование fschange

Одним из доступных инструментов является fschange. Этот инструмент позволяет отслеживать изменения в файловой системе и может быть установлен без прав суперпользователя. Скачайте его исходный код с официального сайта и скомпилируйте его. После этого вы сможете использовать fschange для мониторинга изменений файлов и запуска make:

fschange -r /path/to/monitoring/dir | while read line; do
    make -C /path/to/project | grep -v -e "Nothing to" -e "Entering" -e "Leaving"
done

2. Использование systemd путь-сервисов

Если у вас есть доступ к systemd, вы можете создать path unit, который будет следить за изменениями в указанной директории:

  1. Создайте файл projectrebuild.path в директории ~/.config/systemd/user/:
[Unit]
Description=Мониторинг изменений файлов проекта

[Path]
PathModified=/путь/к/мониторируемой/директории
Unit=projectrebuild.service

[Install]
WantedBy=default.target
  1. Создайте файл projectrebuild.service в той же директории:
[Unit]
Description=Перестроить проект

[Service]
Type=oneshot
ExecStart=/путь/к/скрипту/сборки
  1. Активация и запуск:
systemctl --user enable --now projectrebuild.path

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

3. Использование bash polling (первоначальный метод)

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

last_build_time=0

while true; do
    current_build_time=$(find /path/to/project -type f -printf "%T@\n" | sort -n | tail -1)

    if (( $(echo "$current_build_time > $last_build_time" | bc -l) )); then
        make -C /path/to/project | grep -v -e "Nothing to" -e "Entering" -e "Leaving"
        last_build_time=$current_build_time
    fi

    sleep 1
done

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...