Почему sudo изменяет команду блокировки на неблокирующую команду при использовании в цикле while?

Или: Как предотвратить прерывание sudo'ed rsync во время цикла? Потому что это то, что происходит (чувствует), и я не понимаю.

Я пытаюсь настроить часы для синхронизации файлов, и он отлично работает. Однако, как только я введу требуемый sudo в команду rsync , одно событие inotify вызывает команду rsync огонь бесконечно.

#!/usr/bin/env bash
inotifywait -m -r --format '%w%f' -e modify -e move -e create -e delete /var/test | while read line; do
    sudo rsync -ah --del --progress --stats --update "$line" "/home/test/" 
done

Когда вы редактируете файл, rsync переходит в режим быстрого пожара. Но потеряйте sudo (и используйте папки, к которым у вас есть разрешения, конечно), и скрипт работает так, как ожидалось.

  1. Почему это?
  2. Как правильно выполнить эту работу с помощью команды sudo ?
0
nl ja de
Команда отлично работает без пароля - у меня есть rsync , разрешенный в sudoers с nopassword . Команда также выполняется правильно, она синхронизирует файл. Но он продолжает делать это снова и снова, пока я не сломаю скрипт.
добавлено автор Redsandro, источник
К сожалению, это не связано. В противном случае это поведение также повлияет на вариант, не относящийся к судо. Кроме того, я также хочу отслеживать творения, удаления и движения. Я тестирую с помощью echo test> test.txt , никаких временных файлов или изменений атрибутов здесь.
добавлено автор Redsandro, источник
@shellter: Он должен работать неограниченно, и исходный скрипт работает нормально. Введение sudo нарушает это поведение, и в этом суть этого вопроса. @ Icarus3: Возможно. Я верю тебе. :) Я не проверял, это не имеет значения. @All: Я ответил на свой вопрос, но я не понимаю, почему sudo нарушает ожидаемое поведение bash.
добавлено автор Redsandro, источник
Я не вижу условия в вашем цикле while, который говорит: «Хорошо, достаточно, давайте бросить». Не означает ли inotifywait продолжать работать вечно? Удачи.
добавлено автор shellter, источник
ваш заголовок говорит «как я могу предотвратить sudo'ed rsync от бесконечного обжига в цикле while?», но НЕ «почему мой бесконечный цикл больше не работает, после того, как я добавил sudo», что и указывает ваш комментарий это проблема. Рад, что вы нашли решение своей проблемы и что вы отправили ответ здесь. Не забудьте принять свой ответ с помощью chk-метки, чтобы увеличить свои очки репутации !. Удачи.
добавлено автор shellter, источник
Когда вы применяете sudo, я подозреваю, что rsync ждет ввода пароля. и вот как вы думаете, rsync работает неограниченно долго. Вы пытались запустить sudo'ed rsync в командной строке в качестве автономной команды? он запрашивает пароль? если да, вы можете использовать команду expect для автоматизации ввода пароля.
добавлено автор Icarus3, источник
Ах! получил вашу проблему !! дело в том, когда вы редактируете любой файл, большая часть редактора создает файл подкачки или даже обновляет метку времени. это вызывает много изменений уведомлений на «inotifywait», вы должны передать «-e close_write» переключатель в команду inotifywait. на самом деле, просто не ищите изменений. см. stackoverflow. ком/вопросы/10300835/& hellip;
добавлено автор Icarus3, источник
thats correct, echo этого не сделает. попробуйте «vim /var/test/a.txt» и продолжайте редактировать его во время работы вашего скрипта. Всякий раз, когда вы нажимаете enter в vim, вы увидите rsync. нет?
добавлено автор Icarus3, источник

1 ответы

У меня есть ответ, нашел его, экспериментируя. Но я понятия не имею, почему это так. Пожалуйста, скажите мне, почему sudo в этом цикле нарушает ожидаемое поведение блокировки.

Since sudo breaks the script, we can distance ourselves from sudo by using a wrapper:
This is correct:

inotifywait -m -r --format '%w%f' -e modify /var/test | while read line; do
    sh -c 'sudo rsync -ah "$line" "/home/test/"'
done

Weird thing is: Pull the sudo out of the wrapper and we have the old faulty behavior again. Very strange.
This is wrong:

inotifywait -m -r --format '%w%f' -e modify /var/test | while read line; do
    sudo sh -c 'rsync -ah "$line" "/home/test/"'
done
1
добавлено
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.