Во-первых, возможна буферизация; по умолчанию вывод в not-terminal-not-standard-error буферизируется по блокам (согласно setvbuf (3) ), поэтому не следует ожидать появления каких-либо журналов до тех пор, пока буфер не будет заполнен (или вообще не будет, когда что-то вылетает или съедает фатальный сигнал). Это лучше всего протестировать с двумя терминалами, один для выполнения команд, а другой для tail -f
выходной файл:
# terminal watcher (how do the log lines appear in the logfile?)
rm logf; touch logf; tail -f logf
# terminal test commands (feed logfile)
php -r 'while(1){echo "logline\n";sleep(1);}' >> logf
...
^C
perl -E 'while(1){say "logline";sleep 1}' >> logf
...
^C
Из этого видно (по крайней мере, в моей системе), что PHP не блокирует выход стандартного буфера, отклонение от дефолта; однако head
выполняет буферизацию, а stdbuf
не помогает, так как все строки журнала появляются в сгустке:
php -r 'while(1){echo "logline\n";sleep(1);}' | head -7 >> logf
php -r 'while(1){echo "logline\n";sleep(1);}' | stdbuf -o 0 -- head -7 >> logf
Итак, head
, вероятно, неправильный инструмент для этой задачи. (Кстати, различные приложения будут буферизоваться внутри, поэтому любые ужасные действия stdbuf
могут не помочь:
stdbuf -o 0 perl -E 'while(1){say "logline";sleep 1}' >> logf
perl -E 'STDOUT->autoflush;while(1){say "logline";sleep 1}' >> logf
Если это вообще возможно, установите соответствующую буферизацию в самом приложении.)
Жесткое ограничение на количество строк журнала потребует чего-то, что потребляет N строк, но затем остается открытым (или приложение затем будет убито, или ...?):
php -r 'while(1){echo "logline\n";sleep(1);}' 2>&1 \
| perl -ne 'BEGIN{STDOUT->autoflush; $N=7 } if($N>0){print;$N--}' >> logf
Или это можно было бы сделать внутренне с помощью PHP, предполагая, что все журналы могут быть маршрутизированы через функцию для обработки этой задачи или модуль или фреймворк ведения журнала. В противном случае есть набор инструментов, которые регистрируют ротацию стандартных , с различными уровнями опций и задействованных кривых обучения, хотя в них, похоже, не хватает «N строк» и вместо этого устанавливаются ограничения в зависимости от размера.
Помимо жестких ссылок, индексный дескриптор файла гарантированно уникален в пределах одной файловой системы. Перебор файлов .JPG
в текущем каталоге и переименование ( mv
-ing) с помощью stat
для получения inode:
for i in *.JPG; do echo mv -- "$i" "$(stat -c '%i' "$i")"; done
echo
выдаст команду mv
, которая будет запущена. Удалите echo
для фактического действия:
for i in *.JPG; do mv -- "$i" "$(stat -c '%i' "$i")"; done
Кроме того, если вы хотите, чтобы окончательные имена файлов также имели расширение .JPG
:
for i in *.JPG; do mv -- "$i" "$(stat -c '%i' "$i").JPG"; done