====== Важные Приемы для BASH и Linux ======
===== O_DIRECT Как скопировать файлы не портя кеш, чтоб комп не тормозил =====
* Удобно - crab_cp_nocache
* Нативно - dd conv=noerror iflag=direct if="$src" of="$dst" oflag=direct bs=128000
* Если большой файл скопировать на другой сервер - crb_sync
* Если не только копирование, а разные утилиты частично - https://github.com/Feh/nocache он использует posix_fadvise(fd, offset, len, POSIX_FADV_DONTNEED). Чистит только при закрытии поэтому при больших файлах толку мало.
===== Как отправить почту с авторизацией из shell стандартной утилитой mail =====
yum install mailx
echo -e \
"To: admin@example.com
Subject: Hello Admin\n
Это тело сообщения\n" \
| mail -S ssl-verify=ignore \
-S nss-config-dir=/etc/pki/nssdb \
-S hostname=myhost.example.com \
-S smtp=smtp.example.com:465 \
-S smtp-use-starttls \
-S from="user123@example.com" \
-S smtp-auth=login -S smtp-auth-password='*********' \
-S smtp-auth-user=user123 -S ssl-no-default-ca \
-a "admin@example.com" \
-t \
-S verbose
===== pidof -c =====
**Выводит список процессов только текущего chroot**
Часто нужно проверить наличие процесса в системе по имени. Платформа использует chroot контейнеры, потому задача усложняется: нам обычно не интересны одноимённые процессы из других контейнеров.\\
Я встречал 2 подхода:
* нет проверки контейнера(что по-сути потенциальный баг)
* проверка сделана на наличию специфичных для контейнера файлов (видимо как исправление этого бага)
У утилиты pidof есть опция -c, которая делает нужную проверку, и выводит процессы только из текущего chroot. \\ Например: \\ `pidof -с crond` - выведет только крон(ы) текущего контейнера.
===== Не запускать дубль скрипта =====
if pidof -csxo %PPID "${0##*/}"; then
echo "Already running" >&2
exit 1
fi
Опции:
* -c - в текущем chroot
* -s - одного pid достаточно
* -x - проверять скрипты
* -o %PPID - исключить из поиска вызывающий скрипт, т.е. нас самих.
* "${0##*/}" - имя скрипта
===== Не сохранять историю =====
Иногда, производя работы нужно скрыть использование определённых команд.
Чтобы bash не сохранял историю по завершению интерактивной сессии можно сделать
unset HISTFILE
===== Удалить аргумент из списка =====
Сложные изменения $@
# удаляем --user-login из списка аргументов
for arg do
shift
[[ "$arg" = "--user-login="* ]] && continue
set -- "$@" "$arg"
done
===== Убрать/заменить не валидные символы =====
Бывает нужно из строки сделать имя файл или переменной, и при этом, чтобы имя было из определённых символов:
# замена всех не букв-цифр на _
# есть и другие классы, также можно указать конкретные символы и диапазоны
ts@ts:~$ echo "$(tr -c '[:alnum:]' '_' <<<"var some/value+other?thing")"
var_some_value_other_thing_
# удаление всех не букв-цифр и _
ts@ts:~$ echo "$(tr -cd '[:alnum:]_' <<< "var_some??_value+++_other_thing")"
var_some_value_other_thing
# Очень полезно иногда заменить несколько пробелов одним, чтобы использовать потом cut
ts@ts:~$ tr -s '[:blank:]' <<<"field1 field2 field3" | cut -d " " -f 1,3
field1 field3
* -c = --complement, дополнение множества символов из первого параметра (все остальные символы, кроме перечисленных)
* -d = --delete
* -s = --squeeze-repeats - убрать повторы указанных символов
~~OWNERAPPROVE~~ Обязательны к прочтению всем /*Не удаляйте эту строку и ниже!*/
{(rater>id=1|name=Прочитал_howto:howto_bash|type=vote|trace=user|tracedetails=1)}