Translate

четвер, 15 серпня 2013 р.

Dialog: ncurses-інтерфейс до shell-скрипта

Мабуть багато-хто якось думав, що було б непогано наділити власний скрипт графічним інтерфейсом. Навіщо він потрібен - це вже інше питання: наприклад, для людей, далеких від консольних програм, користування псевдографічним інтерфейсом буде зрозумілішим чи просто таким чином скрипт буде виглядати дещо професійніше або ж ви лише думаєте, що він необхідний - а насправді це просто марнування часу. Для реалізації таких простих інтерфейсів будемо використовувати програму dialog (ncurses-інтерфейс) та shell.

Звісно програму необхідно спочатку встановити:

# aptitude install dialog

Продемонструю його роботу з найпростішим case-скриптом.

#!/bin/bash

dialog --title 'Перезапуск мережі' \
       --yesno "Ви насправді бажаєте перезавантажити сервіс мережі на комп'ютері?" 10 40

case "$?" in
'0')
sudo service networking restart > /dev/null &2>1
echo 'Restarting...'
;;
'1')
exit 0
;;
-1|255)
echo "Сталась помилка, або ви натиснули ESC"
esac

Ключем "-yesno" вказуємо програмі dialog створити вікно з вибором "Так" чи "Ні", "--title" - встановлює назву вікна. Відповідь, що була обрана буде ідентифікуватись зі змінної $? (код завершення останньої команди). Тобто dialog буде повертати "0", якщо було обрано "Yes" та "1" - якщо "No". "10 40" - це позиція вікна, можна указати дефолтні - "0 0".
Також dialog повертає код "-1" у випадку, коли сталась помилка та "255", якщо було натиснено клавішу ESC.



субота, 3 серпня 2013 р.

Debug with Strace

Іноді програма не працює як необхідно: незрозуміло які вона читає налаштування чи сегфолтиться в самий непідходящий момент. Саме тому, коли необхідної інформації недостатньо в системних логах, буває корисно скористатись якимось простим деббагером і strace гарно виконує цю роль.

Strace - трасувальник системних викликів і сигналів, інакше кажучи деббагер, котрий здатний виводити результати в системний термінал. Працює в ОС Linux та деяких Unix-системах. Робота програми можлива завдяки системному виклику ptrace ("process trace") в ядрі ОС.

Для початку його необхідно його установити:

# apt-get install strace

Розпочнемо з найбільш простого прикладу: перевіримо, які системні виклики з'являються при запуску команди ls

$ strace ls
 execve("/bin/ls", ["ls"], [/* 49 vars */]) = 0
brk(0)                                  = 0x6ef000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa60c3a3000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=147033, ...}) = 0
mmap(NULL, 147033, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa60c37f000
close(3)                                = 0
....
write(1, "8154c50c.jpg\t\t   Desktop\t\t\t  fil"..., 618154c50c.jpg  Desktop  films out.log  walls
) = 61
close(1)                                = 0
munmap(0x7fa60c3a2000, 4096)            = 0
close(2)                                = 0
exit_group(0)                           = ?