Вопрос или проблема
Я хотел постоянно пересобирать и тестировать проекты, но только что обнаружил, что дистрибутив 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
, который будет следить за изменениями в указанной директории:
- Создайте файл
projectrebuild.path
в директории~/.config/systemd/user/
:
[Unit]
Description=Мониторинг изменений файлов проекта
[Path]
PathModified=/путь/к/мониторируемой/директории
Unit=projectrebuild.service
[Install]
WantedBy=default.target
- Создайте файл
projectrebuild.service
в той же директории:
[Unit]
Description=Перестроить проект
[Service]
Type=oneshot
ExecStart=/путь/к/скрипту/сборки
- Активация и запуск:
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
будут более эффективными и современными по сравнению с простым опросом файловой системы. Это значительно упростит управление проектом и будет соответствовать концепциям конкурентного программирования, которые вы изучаете.