LINUX.ORG.RU

Скрипт для монтирования usb устройств


0

2

Здравствуйте! Написал для себя скрипт. Он помогает монтировать и отмонтировать usb устройства.
Не ругайте за то, как он написан, не имею никакого образования в данной области, просто нравится писать для себя удобные мини-программы, упрощающие жизнь.

Cам скрипт выложу в конце, не понял, как сюда спойлеры цеплять, как на форуме ubuntu.

А вопрос заключается в следующем.. Хочу сделать, чтобы список устройств обновлялся, то есть, чтобы не приходилось по несколько раз открывать скрипт.
Та часть, где выводятся устройства может обновляться с помощью
while :; do
...
sleep 1s
done &

Но в таком случае, эта часть не перестает выполняться при выборе действия (нажатии клавиши), так как выполняется в фоновом режиме.

Возможно ли остановить выполнение фоновой задачи при нажатии клавиши?

Или может быть вы что-то совсем другое предложите.. Спасибо!


#!/bin/bash

spis=(`ls /dev/sd* | sed 's/\/dev\/sda[0-9]\?//; s/\/dev\///'`); kolvo=`echo ${spis

  • } | wc -w`
    fg='tput cup'

    if [ «$spis» = «» ]; then
    tput setb 7
    tput setf 0
    clear
    echo «$($fg 3 4)NO DEVICES!»
    sleep 2s

    else
    while :; do
    tput setb 7
    tput setf 0
    clear
    echo «$($fg 1 38)┌---------------------------------┐»
    echo «$($fg 2 38)|»; echo «$($fg 2 72)|»
    echo «$($fg 3 38)|»; echo «$($fg 3 72)|»
    echo «$($fg 4 38)|»; echo «$($fg 4 72)|»
    echo «$($fg 5 38)|»; echo «$($fg 5 72)|»
    echo «$($fg 6 38)|»; echo «$($fg 6 72)|»
    echo «$($fg 7 38)|»; echo «$($fg 7 72)|»
    echo «$($fg 8 38)|»; echo «$($fg 8 72)|»
    echo «$($fg 9 38)|»; echo «$($fg 9 72)|»
    echo «$($fg 10 38)|»; echo «$($fg 10 72)|»
    echo «$($fg 11 38)└---------------------------------┘»

    echo «$($fg 1 4)Devices:»

    a=0
    b=1
    echo
    while [ «$a» -lt «$kolvo» ]; do
    fu[$b]=${spis[$a]}
    ((q=b+2))
    echo «$($fg $q 4)$b) /dev/${fu[$b]}»
    mountpoint -q /media/${fu[$b]}
    if [ $? = '0' ]; then
    echo «$($fg $q 16)$(tput setf 4) - mounted!$(tput setf 0)»
    fi
    ((a++))
    ((b++))
    done

    echo «$($fg 3 40)Select action:»
    echo «$($fg 5 40)m) Mount device and open folder»
    echo «$($fg 6 40)u) Unmount folder»
    echo «$($fg 7 40)o) Open folder»
    echo «$($fg 9 40)0) Close script»

    echo «$($fg 19 20)┌---------------------------------------------┐»
    echo «$($fg 20 20)| |»
    echo «$($fg 21 20)└---------------------------------------------┘»
    tput cup 20 22

    mountpoint -q /media/sdb1
    if [ «$kolvo» = «2» -a $? = '1' ]; then
    dejstv=«m»
    else
    read -s -n1 dejstv
    fi

    case $dejstv in
    m)
    mountpoint -q /media/sdb1
    if [ «$kolvo» = «2» -a $? = '1' ]; then
    b=2
    else
    echo «какое устройство необходимо примонтировать?»; read -s -n1 b
    fi
    if [ ! -d /media/${fu[$b]} ]; then
    echo -e «папки для монтирования устройства нет!\nчтобы создать, введите пароль»
    sudo mkdir /media/${fu[$b]}
    fi
    sudo mount -o noauto,uid=1000,fmask=111,dmask=000 /dev/${fu[$b]} /media/${fu[$b]}
    mc /media/${fu[$b]} ~;;
    u)
    mountpoint -q /media/sdb1
    if [ «$kolvo» = «2» -a $? = '0' ]; then
    b=2
    else
    echo «какую папку необходимо размонтировать?»; read -s -n1 b
    fi
    sudo umount /media/${fu[$b]} 2>/dev/null
    mountpoint -q /media/${fu[$b]}
    if [ $? = '0' ]; then
    tput cup 20 22
    echo «device is busy. Kill processes? (y/N)»; read -s -n1 ans
    if [ «$ans» = «y» ]; then
    fuser -km /media/${fu[$b]}
    sudo umount /media/${fu[$b]}
    tput cup 20 22; echo «устройство отмонтировано ;) »; sleep 1s
    exit 0
    fi
    else
    tput cup 20 22; echo «устройство отмонтировано ;) »; sleep 1s
    exit 0
    fi
    ;;
    o)
    mountpoint -q /media/sdb1
    if [ «$kolvo» = «2» -a $? = '0' ]; then
    b=2
    else
    echo «какую папку открыть?»; read -s -n1 b
    fi
    mc /media/${fu[$b]} ~;;
    0)
    echo «закрываюся...»
    sleep 2s
    exit 0;;
    esac

    done
    fi

не понял, как сюда спойлеры цеплять

Используй тэг quote в режиме LORCODE.

По сабжу. Я так понимаю, тебе нужно реализовать синхронизацию потоков. Никогда подобного не видел на bash. Самому интересно послушать ответы =)

observer ★★★
()

Скрипт не читал, приведите его в божеский вид (см. LORCODE)

вкратце всё просто - вы запускаете один процесс асинхронно, и теперь вы можете с ним взаимодействовать, отсылая и принимая сигналы. Для этого конечно надо знать PID дочернего процесс, его покажет $!

Возможно ли остановить выполнение фоновой задачи при нажатии клавиши?

Конечно. Зная PID дочернего процесса, сделайте, что-бы родитель послал ему сигнал завершения (SIGTERM к примеру), командой kill $PID.

drBatty ★★
()
Ответ на: комментарий от observer

Никогда подобного не видел на bash

это почти никогда и не нужно... Можно конечно сделать, язык это позволяет...

drBatty ★★
()

Скрипт не читал, но ТСу вопрос. А udev отменили? Не проще на него повесить скрипт, выполняющий нужные действия по факту подключения носителя? Я таким игрался в своё время, чтобы флешки друг от друга отличались. По одному сериалу делаешь одно, по другому — другое. Можно даже реакцию на определённую флешку повесить, чтобы при вставке её однострочник выполнялся (паранойя уже да?)

Delirium_veritas
()

Ничего себе! А что, в вики почитать нельзя было? Вон, анонимус подсказывает даже, где.

Eddy_Em ☆☆☆☆☆
()

Cам скрипт выложу в конце, не понял, как сюда спойлеры цеплять, как на форуме ubuntu.

http://pastebin.com/

О Боже, ну и говнокод! Я очень пожалел, что читал это…

/dev/sd*

mountpoint -q /media/sdb1

sudo

sleep 2s

echo «какую папку открыть?»

echo «$($fg 19 20)┌---------------------------------------------┐»

Не говоря о русском языке в echo и названиях $kolvo и $dejstv. Для монтирования есть udisks, для такого интерфейса ncurses.

gentoo_root ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.