Вы можете использовать один из инструментов опроса, которые предшествуют dnotify и inotify : gamin ] или fam вместе с чем-то вроде fileschanged , который представляет собой инструмент командной строки, подобный inotifywait
. Проекты gamin и fam связаны между собой, и оба они довольно старые (хотя gamin немного меньше).
Для простых и переносимых задач я использовал что-то вроде этого через cron:
if mkdir /var/lock/mylock; then
( cd /mnt/mypath; find . -type f -mmin +2 ) | myprocess
rmdir /var/lock/mylock
else
logger -p local0.notice "mylock found, skipping run"
fi
Здесь используется примитивная блокировка и условное выражение GNU find
для поиска только файлов более старых , чем две минуты, чтобы я мог быть уверен, что файлы были полностью записаны. В моем случае myprocess
был rsync --remove-source-files --files-from = -
, поэтому файлы удалялись сразу после обработки.
Этот подход также позволяет использовать find -print0
/ xargs -0
/ rsync -0
для обработки проблемных имен файлов.
Если вы должны хранить все (старые и новые) файлы в одной иерархии каталогов, то создание снимков со списком каталогов и их сравнение также может сработать для вас:
if mkdir /var/lock/mylock; then
(
export LC_COLLATE=C # for sort
cd /mnt/mypath
find . -type f -a \! -name ".dirlist.*" -printf '%p\0' |
while read -d '' file; do
printf "%q\n" "${file}"
done > .dirlist.new
[[ -f .dirlist.old ]] && {
comm -13 <(sort .dirlist.old) <(sort .dirlist.new) |
while read -r file; do
myprocess "${file}"
done
}
mv .dirlist.new .dirlist.new
)
rmdir /var/lock/mylock
else
logger -p local0.notice "mylock found, skipping run"
fi
Этот сценарий bash
:
find -printf
для печати списка файлов с разделителями \ 0 (nul). read -d ''
для обработки этого списка и printf % q
для экранирования имен файлов, где это необходимо myprocess
с каждым новым файлом (в кавычках) (Также обработка изменена Для файлов потребуется немного больше усилий, можно использовать двухстрочный формат с find ... -printf '% p \ 0% s% Ts \ 0'
с соответствующими изменениями в , в то время как
зацикливается.)
Когда вы находитесь за консолью, и журналы не позволяют вам работать, используйте команду как sudo / root:
dmesg -n 1
, и журналы перестанут отображаться в консоли.
Из man dmesg
:
-n, --console-level level Установить уровень, на котором выполняется печать сообщений для единственной консоли . Уровень - это номер уровня или сокращение от названия уровня . Для всех поддерживаемых уровней см. Вывод --help. Например, -n 1 или -n alert предотвращает появление всех сообщений, кроме аварийных (панических) сообщений. консоль. Сообщения всех уровней по-прежнему записываются в / proc / kmsg, поэтому sys - logd (8) по-прежнему можно использовать для управления точным отображением сообщений ядра . Когда используется опция -n, dmesg не будет печатать или очищать кольцевой буфер ядра.
Если память меня не выдаст,
dmesg -n 0
возвращает вам сообщения в консоли как только вы закончите свою работу
rsyslog.conf
/ syslog-ng.conf
также можно изменить, чтобы прекратить регистрацию на консолях text / X, хотя вы можете оставить это как по умолчанию, поскольку они предоставляют бесценную обратную связь, когда вам это действительно нужно.
Помните, что фактические сообщения журнала просто выводятся на stdout
, а не на stdin
, поэтому, несмотря на то, что вы теряете значимую визуальную обратную связь, вы все равно можете вводить команды в a go, как и вышеупомянутый dmesg -n 1
. Просто убедитесь, что при вводе команды прикосновением в этой ситуации не используйте потенциально опасные команды, такие как rm
. Всякое случается.