Howto Bash
Важные Приемы для 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<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~~ Обязательны к прочтению всем
Прочитал howto howto bash |