Občas se mi zdá, že při řešení problémů zde na fóru se stráví hodně času mámením dodatečných informací od přispěvatele, které jsou pak často neúplné, přispěvatel příkaz špatně zkopíruje apod. Napadlo mě, že pokud by se podařilo vytvořit skript, který by informace k problému schraňoval automaticky (něco podobného
boot_info_scriptu na řešení problémů při bootování nebo systémového
apportu), ušetřilo by nám/přispěvatelům to spoustu práce.
Jako vzorek jsem udělal bash skript na analýzu problémů s externími disky apod. Návod jsem se snažil udělat tak, aby se nemusel použít terminál.
Postup by byl asi takový: návod by byl na wiki včetně skriptu (aby ho mohl kdokoli doplnit/upravit).
Skript by se zkopíroval do souboru na plochu.
Pravoklik na skript a vybrat
Otevřít jinou aplikací.
Použít vlastní příkaz a tam dát
gksudo bashPak už skript pracuje sám. Výsledek uloží do souboru na plochu -
výsledek.txt a ten se zkopíruje zpět do fóra.
Moje dotazy:
1. Myslíte, že by to takto mohlo fungovat, a že by to opravdu ulehčilo práci?
2. Zkuste postup i skript na nějakém svém externím zařízení (flash disk třeba). Funguje jak má?
3. Znáte nějaký elegantnější způsob, jak spustit skript s právy roota bez použití terminálu? Nebo jak mít kód veřejně dostupný/upravovatelný, a přitom si ho může kdokoli lehce stáhnout?
Vzorový skript ("DiskDebug")
#! /bin/bash
Devkit(){
for i in /dev/[sh]d[a-z]*; do
devkit-disks --show-info $i
done
}
if [[ `whoami` != "root" ]]; then
zenity --info --title="DiskDebug" --text="Musíš být root!\nSpouštěj skript přes gksudo."
exit 1
fi
# seznam příkazů, u nichž budeme dělat diff
DiskPrikazy=( "dmesg" "lsusb" "fdisk -l" "parted -l" "mount" "blkid -c /dev/null" "Devkit" )
# seznam obecných příkazů, které by mohly naznačit, že problém je někde jinde
SystemPrikazy=( "uname -a" "cat /etc/lsb-release" "free -m" "df -h" )
AktAdresar=$(cd $(dirname $0);pwd)
# vytvoř temp soubory s výpisy příkazů
for i in $(seq 0 $((${#DiskPrikazy[@]} - 1))); do
${DiskPrikazy[$i]} &> /tmp/$i.txt
done
zenity --info --title="DiskDebug" --text="Ujisti se, že je zařízení vysunuté z počítače nebo vypnuté.\nPak znovu připoj zařízení.\nAž bude připojené, klikni OK."
# čekej, než systém disk zaregistruje
( for i in {1..15}; do echo $(($i * 7)); sleep 1; done ) |
zenity --title="DiskDebug" --text="Sbírám data" --progress --percentage=0 --auto-close --auto-kill
# veškerý výstup odteď jde do výsledky.txt
exec &> $AktAdresar/výsledky.txt
# znovu výstup z DiskPrikazy, ale výstupem bude jen rozdíl mezi temp a aktuálním
for i in $(seq 0 $((${#DiskPrikazy[@]} - 1))); do
prikaz=${DiskPrikazy[$i]}
echo
echo $prikaz
echo ---------------------------
$prikaz | diff - /tmp/$i.txt
done
# zaznamenej výstup z obecných příkazů
for i in $(seq 0 $((${#SystemPrikazy[@]} - 1))); do
prikaz=${SystemPrikazy[$i]}
echo
echo $prikaz
echo ---------------------------
$prikaz
done
exit 0