Новичкам


romy4 аватар

Как не забыть сделать что-то важное, когда есть много точек выхода из скрипта

Допустим, у вас есть большой скрипт, у которого более, чем одна точка выхода и в этом скрипте вы создаёте кучу временных файлов.

#!/bin/bash
 
declare -a tmp_files
 
pre_exit() {
   rm -f ${tmp_files[1]}
   rm -f ${tmp_files[2]}
   ...
}
 
do_stuff
[ $? -gt 0 ] && pre_exit && exit 1
 
sed
cut
cp
mv
cat
cat
awk { 
..
}
ps auwx | grep
[ $? -gt 0 ] && pre_exit && exit 1
 
other_stuff
 
...
pre_exit

Знакомо, да?

0
Ваша оценка: Ничего
romy4 аватар

Lenovo ideapad every time loses network connection

Fix is simple:
run as root

$ nmcli -p d list

find

GENERAL.DEVICE: wlan0
GENERAL.DRIVER: rtl8723be

got rtl8723be

$ cd /etc/modprobe.d
$ editor rtl8723be.conf

put:

options rtl8723be ant_sel=2

and reboot

0
Ваша оценка: Ничего
romy4 аватар

Matrix

Сыпящаяся матрица в консоли. Мне пришлось пару строчек в скрипте подправить дабы оно работало как отдельный скрипт, а не только command-line
0
Ваша оценка: Ничего
romy4 аватар

ping + graph

gping — маленькая утилита на Python с открытым исходным кодом, представляющая собой замену команде ping, только с графиком, отражающим изменение пинга со временем.

Установить утилиту можно с помощью pip3:
pip3 install pinggraph

0
Ваша оценка: Ничего
romy4 аватар

Пищалка

Чтобы в Линуксе пищать пищалкой нужно поставить beep.
Но она может молчать. Чтобы заставить её таки пищать, нужно подгрузить модуль ядра для pc speaker:

modprobe pcspkr
0
Ваша оценка: Ничего
romy4 аватар

Порядок аргументов для getopts

getopts не будет обрабатывать параметры, если они переданы после аргументов без дефиса
./myscript -a 1 -b 2 hello world
getopts вернёт a и b с параметрами, $OPTIND станет = 4, но
./myscript hello world -a 1 -b 2
работать не будет

rtfm
In fact, getopts will not process arguments without the prefixed -, and will terminate option processing at the first argument encountered lacking them.

getopts != getopt, хотя первое сделано для замены второго

0
Ваша оценка: Ничего
romy4 аватар
romy4 аватар

Блокировка экрана если юзер не ответил на вопрос за несколько секунд.

Я логинюсь под юзером и иду пить кофе, но мне лень ждать момент, чтобы нажать на клавишу блокировки экрана после загрузки рабочего стола. Выход — сделать такую блокировку автоматически с вопросом: "если ты здесь, то нажми кнопку, иначе через 5 секунд всё заблокируется".

В ubuntu/mint есть стандартная утилита оконных сообщений zenity. Она умеет многое из того, что умеет dialog, ею воспользуемся.

zenity --text "Не блокировать комп?" --timeout=3 --question --modal

В ответе утилита возвращает результат: 0, 1 или 5 (да, нет или таймаут).

case $result in
1|5)
    gnome-screensaver-command -l
    ;;
esac

Если нет или таймаут, то блокируем комп через гномовский скринсейвер, так как он отвечает за блокировку.

0
Ваша оценка: Ничего
romy4 аватар

Переместить приложение на нужный рабочий стол в x=0:y=0 и нажать кнопку

Автоматизируя рабочий стол наткнулся на то, что FF с установленным session manager не хочет нормально запускаться. Точнее, он запускается и ждёт нажатия кнопки выбора сессии. Даже если каким-то образом удастся его запустить, оно всё равно открывается на правом мониторе, а нужно на левом. Как решить?

Есть два варианта: переключиться на другой workspace и там запустить или запустить на текущем, а потом переместить окна на другой workspace.

Под катом решение.

0
Ваша оценка: Ничего
romy4 аватар

Нумерация скачанной музыки

Идея в том, что вы скачиваете плейлист в правильном порядке, а потом эта неорганизованная куча файлов после команды опять стаёт в порядке плейлиста. Суть в том, что каждый файл сохраняет своё время изменения на секунду больше предыдущего. Этим надо воспользоваться.
Допустим, скачали кучу файлов из плейлиста в папку Music/new, там они сейчас в перемешку, так как имена разные. Делаем их в нужном порядке и нумеруем следующей командой (предварительно зайдя через консоль в Music/new):

ls -1rat | awk '/^[^.]/ {print $0}' | awk  '{name=sprintf("%03i - %s",NR,$0);system("mv \""$0"\" \""name"\"")}'

не сработает, если в названии есть (`) обратный апостроф

%03i - нумерация от 000 до 999, если надо 0000-9999, то ставим %04i

Ссылки в тему:

0
Ваша оценка: Ничего
romy4 аватар

Системная информация в читаемом виде

$ sudo inxi -Fx

0
Ваша оценка: Ничего
romy4 аватар

Little about Find

  1. Find large files
    find /home -type f -size +5000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'
  2. Find files / directories with 777 permissions
    #find 777 files
    find / -type f -perm 0777
    #find 777 dirs
    find / -type d -perm 0777

    You can also combine find to skip some folders when copying using this article. Prune tells it to also skip subfolders and subfiles.

    find . ! \( -name images -prune \) -print | cpio -o | ttcp -t yourserver.com -p 10000
  3. Find empty files
    find /home -type f -size -1b -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'
  4. Find empty files and delete
    find /tmp -type f -empty -delete
  5. Find smallest files and delete them
    ls . -S | tail -250 | xargs rm
  6. Find largest files
    ls . -Srl | tail -250
0
Ваша оценка: Ничего
romy4 аватар

Copy millions of tiny files through a network

I had to copy millions and millions of tiny small image files, about 5KB each, total size more than a terabyte, over a network fast.

SCP, NFS, FTPFS and SSHFS where all too slow to work with. All these methods copy every single file piece by piece, causing lots of overhead, I never reached more than 1MB/s over a gigabit line.

The fastest solution I came up with after lots and lots of testing was this:

Receiving server:

ttcp -r -p 10112 | cpio -i -d -m

Sending server:

find /home/files -print | cpio -o | ttcp -t receivinghost.com -p 10112

CPIO is slightly faster than TAR, and does not have any problems with long filenames.

  1. Other solution 1 - A little compression
    This solution saves a little bandwidth by gzipping the files. This will only save you bandwidth if you transfer text/html/sql files, images, mp3 and other already compressed formats will only cost more time and overhead.

    Receiving server:
     

0
Ваша оценка: Ничего
FrBrGeorge аватар

Копипаст многих строк в одну

Многострочный текст можно добавить в командную строку, поставив вместо него `cat`.

0
Ваша оценка: Ничего
FrBrGeorge аватар

Снова про перекодирование MP3-тегов

Утилита mid3v2 преобразует старые ID3v1-теги (ака MP3-теги) в новые ID3v2, а утилита mid3iconv поможет сменить их кодировку. Обе входят в пакет mutagen.

0
Ваша оценка: Ничего
FrBrGeorge аватар

Обратный hexdump -C

Утилита xxd не только выполняет шестнадцатеричный дамп, но и может сделать из дампа снова бинарник (с помощью xxd -r). Привычный формат hexdump -C для обратного преобразования надо слегка поправить.

0
Ваша оценка: Ничего

ssh авторизация по ключам и проброс настроек переменных окружения на другие хосты

Собственно, возникла проблема:
Есть n+1 серверов, между которыми надо ходить друг на друга.
При запуске в screen ssh на другие сервера почему-то надо и, как минимум вводить пароль
Почему - проблема кроется в отсоединении screen сессии и "reattach" сессии screen после переподключения.

Дано:
Имеем пару открытый + закрытый ключ.

На первой машине, с которой ходим:

0a) Windows - запускаем Pageant такой командой из bat/cmd скрипта:
# запустить pageant, чтобы после запуска программы окно cmd само закрылось

 
c:\ start полный\путь\к\pageant.exe путь\к\приватному\ключу.ppk

0b) Linux Дописать в Ваш ~/.bashrc|.zshrc нечто вроде

if [ -f ~/.agent ]; then
    . ~/.agent
    if ps -p $SSH_AGENT_PID > /dev/null && [ -S $SSH_AUTH_SOCK ]; then
        echo "ssh agent ok"
    else
        unset SSH_AUTH_SOCK SSH_AGENT_PID
        eval $(ssh-agent -s)
        echo -e "SSH_AUTH_SOCK=$SSH_AUTH_SOCK\nSSH_AGENT_PID=$SSH_AGENT_PID" > ~/.agent
0
Ваша оценка: Ничего
romy4 аватар

Skype delete selected messages

To delete selected Skype messages from the skype chat history follew few next steps:

0. Close Skype before processing these manipulations.

1. Open Skype db file from ~/.Skype//main.db within your favourite SQL manager or using sqlite3

run next sqls:

Check messages:

SELECT * FROM Messages WHERE chatname like '%:username:%';

This SQL shows all your conversations with selected :username:

Or

SELECT * FROM Messages WHERE author like '%:username:%';

to select messages from the subscriber.

Just call

DELETE FROM Messages WHERE chatname like '%:username:%';

to clear history with the subscriber

SELECT * FROM Messages WHERE body_xml like '%:message:%';

To find specific message.

Use `timestamp` field to range the messages on the specific date.

PS.

$ sqlite3 ~/.Skype/<accname>/main.db "DELETE FROM Messages WHERE chatname like '%username%';"

0
Ваша оценка: Ничего

Как ускорить установку пакетов (eatmydata)

Как правильно ставить пакеты с кучей зависимостей, например, ubuntu-desktop, на Debian, Ubuntu и тому подобные дистрибутивы?

Вот так:

$ apt-get install eatmydata
$ eatmydata apt-get install ubuntu-desktop

eatmydata "отключает" функции fsync, sync и т. п., что приводит к более быстрой установке, но при этом может привести к порче данных, если во время установки комп вырубится.

Установка становится быстрее в разы.

См. также: http://www.bestechvideos.com/2007/04/18/linuxconf-au-eat-my-data-how-everybody-gets-file-io-wrong (он же http://mirror.linux.org.au/pub/linux.conf.au/2007/video/talks/278.ogg )

0
Ваша оценка: Ничего
romy4 аватар

Хрипит, хрустит, дублируется, пропадает звук. особенно intel hd

Три метода (после каждого перезагружаемся):

1) открыть /etc/modprobe.d/alsa-base.conf

$ sudo gedit /etc/modprobe.d/alsa-base.conf

и добавить строчку

$ options snd-hda-intel vid=8086 pid=8ca0 snoop=0

перезагрузиться.

2) если не помогло, то открыть /etc/pulse/default.pa

$ sudo gedit /etc/pulse/default.pa

и заменить

$ load-module module-udev-detect

на

$ load-module module-udev-detect tsched=0

перезагрузиться.

3) если уже совсем ничего, то может быть это:
отредактировать /usr/lib/pm-utils/power.d/intel-audio-powersave

$ gksu gedit /usr/lib/pm-utils/power.d/intel-audio-powersave

заменить

$ INTEL_AUDIO_POWERSAVE=${INTEL_AUDIO_POWERSAVE:-true}

на

$ INTEL_AUDIO_POWERSAVE=false

выполнить
 

0
Ваша оценка: Ничего