Я понял. Специальные случаи Bash -\e
, \[
и \]
в PS1. Он преобразует \e
в управляющий байт, \[
в байт 1
и \]
в байт 2
. Внешние команды должны записывать 1
и 2
байт на стандартный вывод.
Согласно ASCII, они кодируют «начало заголовка» и «начало текста».
http://www.columbia.edu/kermit/ascii.html
Вот рабочий пример, основанный на преобразовании printf \
escape-символов в первом позиционном параметре в правильные байты:
PS1='$( render-prompt )'
function render-prompt {
printf '\1\033[0;35m\2$ \1\033[00m\2'
}
render-prompt | hexdump -C
00000000 01 1b 5b 30 3b 33 35 6d 02 24 20 01 1b 5b 30 30 |..[0;35m.$..[00|
00000010 6d 02 |m.|
00000012
What I hence wonder is, what is the need/backgrounding motivation to have those files as sparse, huge files (in my case it was 1.1TB)?
Так и должно быть.
/var/log/lastlog
не является файлом журнала, как /var/log/syslog
, и его имя следует читать как «список последних входов в систему», а не как «последний файл журнала».
Поддерживается модулем pam_lastlog(8)
,и это в основном такой массив:
struct lastlog {
time_t ll_time; // 4
char ll_line[UT_LINESIZE]; // 32
char ll_host[UT_HOSTSIZE]; // 256
} entry[UINT_MAX];
Размеры полей на типичной машине x86 -64 указаны в комментариях; запись должна быть 4 + 32 + 256 = 292 байта.
Каждый раз, когда программа, использующая модуль pam pam_lastlog(8)
, регистрирует пользователя, она будет искать uid * sizeof(struct lastlog)
и перезаписывать запись, соответствующую этому пользователю.
did I corrupt anything with truncating those files ?
Вы испортили вывод команды lastlog(1)
, которую все равно никто не использует;-)
Путем "усечения файла" без информирования (или перезапуска )программ, записывающих в файл журнала, ВЫ создали разреженный файл.
Лучшее решение — найти и устранить проблему, вызывающую все эти сообщения в журнале.
Еще один способ избежать этой проблемы: остановить службу ведения журнала, использовать lsof
, чтобы убедиться, что файл не открыт другими процессами, затем обрезать файл и перезапустить ведение журнала.
В соответствии с запросом, вот модель того, как это (не работает ):
Программа открывает файл для «добавления», ей сообщают, что файл заканчивается в блоке X, и записывает блок X+1. Вы «обрезаете файл», но программа «знает», что следующий блок для записи — это X+2. Таким образом, файл может давать данные в начале, но точно иметь данные в блоке X+2. Та -Да! Разреженный файл.
Эти 2 файла являются файлами типа "данные", если вы проверите с помощью команды ls -l или ls -lh, то увидите, что они занимают очень много места на диске, но на самом деле это не
«ls -s» — это фактическая команда для проверки фактического размера этих файлов.
[root@LinuxServer ~]# file /var/log/lastlog /var/log/faillog
/var/log/lastlog: data
/var/log/faillog: data
[root@LinuxServer ~]# ls -l /var/log/lastlog /var/log/faillog
-rw------- 1 root osg 3166464 Jul 8 21:20 /var/log/faillog
-rw-r--r-- 1 root root 304854077980 Jul 14 21:38 /var/log/lastlog
[root@LinuxServer ~]# ls -lh /var/log/lastlog /var/log/faillog
-rw------- 1 root osg 3.1M Jul 8 21:20 /var/log/faillog
-rw-r--r-- 1 root root 284G Jul 14 21:38 /var/log/lastlog
[root@LinuxServer ~]#
[root@LinuxServer ~]# ls -s /var/log/lastlog /var/log/faillog
3100 /var/log/faillog 748 /var/log/lastlog
[root@LinuxServer ~]# ls -s /var/log/faillog
3100 /var/log/faillog
[root@LinuxServer ~]#
Я наблюдал такое поведение после того, как мы ввели некоторые (большие )номера UID LDAP, -существующие с «обычными» номерами UID UNIX на машине с Linux (RHEL 7 ).
Кроме того, в разделе «ПРЕДОСТЕРЕЖЕНИЯ» страницы руководства для «lastlog» указано, что
*"Large gaps in UID numbers will cause the lastlog program to run longer with no output to the screen"*
«lastlog» будет зависать при обработке записей с промежуточными неиспользуемыми UID
Возможно, это также может быть связано с наблюдаемой проблемой, поскольку назначенные номера UID LDAP FreeIPA были намного больше, чем те, что были в Linux