Проблемы с получением 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 -->