Системные сообщения перемещаются в виртуальную консоль

Вы можете использовать один из инструментов опроса, которые предшествуют 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 :

  1. использует find -printf для печати списка файлов с разделителями \ 0 (nul).
  2. использует read -d '' для обработки этого списка и printf % q для экранирования имен файлов, где это необходимо
  3. сравнивает новый и предыдущий файлы .dirlist
  4. вызывает myprocess с каждым новым файлом (в кавычках)

(Также обработка изменена Для файлов потребуется немного больше усилий, можно использовать двухстрочный формат с find ... -printf '% p \ 0% s% Ts \ 0' с соответствующими изменениями в , в то время как зацикливается.)

3
01.03.2017, 11:46
1 ответ

Когда вы находитесь за консолью, и журналы не позволяют вам работать, используйте команду как 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 . Всякое случается.

2
27.01.2020, 21:25

Теги

Похожие вопросы