Проблемы с получением incron inotify на работу

Поэтому после алекса ответ вот мои шаги:

создание шелл-кода

root@ip[/]# touch mylog.sh
root@ip[/]# nano mylog.sh

копирование кода в mylog.sh

#!/bin/bash
echo "File $1 created." >> /mylog.log

разрешение

root@ip[/]# chmod +x mylog.sh

создание файла журнала

root@ip[/]# touch mylog.log 

открывающийся стол icron

incrontab -e

вводит новую команду в

/test/ IN_CREATE mylog.sh $@$#

перезагрузка incron - создание нового файла - проверка файла журнала

root@ip[/]# incrontab --reload
requesting table reload for user 'root'...
request done

root@ip[/]# cd test
root@ip[/test]# touch newfile.txt

root@ip[/test]# cd /
root@ip[/]# nano mylog.log

но все еще пустой файл журнала... я что-то упустил?


наконец, вызов сценария оболочки с полным путем сделал свое дело так:

/test/ IN_CREATE /mylog.sh $@$#

2 ответа

Решение

Обычно вы можете найти журналы incron в /var/log/messages

Если вы хотите записать события в определенный файл, вы можете использовать:

/test/ IN_CREATE mylog.sh $@$#

где mylog.sh - это сценарий оболочки, который обрабатывает ведение журнала.

#!/bin/bash
echo "File $1 created." >> /home/myuser/filescreated.log

Не забудьте дать разрешение на выполнение этого сценария оболочки с помощью chmod +x mylog.sh

Объяснение: Как только вы начнете использовать параметры для команды, которую вы вызываете, вы должны поместить все это в сценарий оболочки. Поскольку incron не передает аргументы вашей команде, а интерпретирует ее как аргумент для себя.

Не забудьте вызвать incrontab --reload после изменения incrontab.

Другой пример

incrontab -e

/text/ IN_CREATE /home/myuser/mylog.sh $@ $#

mylog.sh

#!/bin/bash
echo "$(date) File $2 in $1 created." >> /home/myuser/log.txt

Следуя ответу Александра Бальтасара , у вас также может быть сценарий, который выполняет перенаправление, и не допускайте, чтобы ваши конечные сценарии были свободны от этой логики.

Нижеstd_wrapper.sh:

      #!/bin/bash

### FLAGS
set -Eeuo pipefail

### INIT SCRIPT
SCRIPT_FULLNAME=$(basename -- ${0})
usage="usage: ${SCRIPT_FULLNAME} log_file target_script target_file watched_dir event"


## ARGUMENTS
log_file="${1}"
target_script="${2}"
target_file="${3}"
watched_dir="${4}"
event="${5}"

### MAIN
if [ -z "${log_file}" ] || [ -z "${target_script}" ] || [ -z "${target_file}" ]; then
  echo "${usage}" >&2
  exit 1
fi

# do the actual call and apply the redirection:
${target_script} "${target_file}" "${watched_dir}" "${event}" >> "${log_file}" 2>&1
  • убедитесь, что скрипт может быть запущен ($ chmod 770 std_wrapper.sh):

В вашейincrontab($ incrontab -e):

      /test/ IN_CREATE /path/std_wrapper.sh /path/log/test.create /path/actual_script.sh $# $@ $%

actual_script.shможет выглядеть примерно так:

      #!/bin/bash

### FLAGS
set -Eeuo pipefail

### Input Parameters
filename="${1}"
watched_dir="${2}"
event="${3}"
full_filename="${watched_dir}${filename}"

### Main
dt="$(date '+%d/%m/%YT%H:%M:%S')"
echo "$dt (event:) $event (file:) $filename (dir:) $watched_dir <----- going to process ----->"
echo "sleeping 10 seconds..."
sleep 10
dt="$(date '+%d/%m/%YT%H:%M:%S')"
echo "$dt (event:) $event (full_filename:) $full_filename <----- returning from sleep -->"

Создание двух файлов последовательно (менее чем за 10 секунд)

      $ touch /test/new-file && sleep 5 && touch /test/another-file

Создал бы журнал следующим образом:

      $ cat /path/log/test.create
07/11/2022T08:00:50 (event:) IN_CREATE (file:) new-file (dir:) /test/ <----- going to process ----->
sleeping 10 seconds...
07/11/2022T08:00:55 (event:) IN_CREATE (file:) another-file (dir:) /test/ <----- going to process ----->
sleeping 10 seconds...
07/11/2022T08:01:10 (event:) IN_CREATE (full_filename:) /test/new-file <----- returning from sleep -->
07/11/2022T08:01:15 (event:) IN_CREATE (full_filename:) /test/another-file <----- returning from sleep -->
Другие вопросы по тегам