Кажется, что следующие программы делают примерно то же самое, и на самом деле они не отличаются. Но это неправда.
#!/bin/bash
s=-1000
for (( i=0; i<1000000; i++ )), do
s=$((s+1))
echo $s
Это правильный способ реализации. Выражение s+1 оценивается оболочкой и может быть присвоено переменной.
#!/bin/bash
s=-1000
for (( i=0; i<1000000; i++ )), do
s=`expr $s+1`
echo $s
Здесь выражение будет вычислено программой expr, которая является не встроенной в оболочку, а внешней программой Unix. Таким образом, вместо простого добавления 1 и s программа должна быть запущена, и ее вывод должен быть прочитан и записан в переменную. Запуск программы требует много ресурсов и много времени. И эта программа запускается 1000000 раз. Так программа будет намного медленнее предыдущей. Тем не менее код работает корректно.
#!/bin/bash -e
s=-1000
for (( i=0; i<1000000; i++ )), do
((s=s+1))
echo $s
Если флаг -e не установлен, программа также будет работать корректно. Но если -e установлено, когда s= -1 и ((s=s+1 вычисляется )). Выражение s=s+1 оценивается как 0, а код выхода ((0 ))>0, что интерпретируется оболочкой как ошибка, и оболочка завершает работу программы.
Причина установки флага -e состоит в том, что это самый простой способ :остановки обработки ошибок в случае возникновения ошибки.
Вы можете использовать инструменты, реализующие fanotify()
API ядра. Например, fanotify -cmd работает отлично. Нет необходимости редактировать какие-либо системные файлы или анализировать журналы.
./fm -a /etc/passwd
checking for events FAN_ACCESS
mask: FAN_ACCESS, fd: 4, pid: 203188, file: /etc/passwd, command: bash
mask: FAN_ACCESS, fd: 4, pid: 203190, file: /etc/passwd, command:
mask: FAN_ACCESS, fd: 4, pid: 203321, file: /etc/passwd, command: ls --color=auto -l /etc/passwd
Или вы можете использовать auditd
. Поскольку это системный демон, вам необходимо отредактировать системный файл конфигурации auditd в /etc
. В сети есть много руководств по их использованию, например. на самом stackexchange .
inotifywait
к сожалению, не работает для этого варианта использования, поскольку он просто показывает файлы, к которым обращаются или изменяют, но не показывает, какой процесс это делает.