The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Как ускорить выполнения скрипта shell (проверка POS принтера)"
Версия для распечатки Пред. тема | След. тема
Форум Программирование под UNIX
Исходное сообщение [ Отслеживать ]

"Как ускорить выполнения скрипта shell (проверка POS принтера)" +/
Сообщение от Pablicemail (?), 17-Авг-20, 16:23 
В общем, есть компьютеры к ним подключены чековые принтеры Posiflex, необходимо при загрузке системы проверить подключен ли чековый принтер к COM порту или нет, если подключен то сделать симлинк для freerdp.
Накидал shell скрипт который проверяет на двух скоростях подключен ли принтер или нет, но проблема вывалилась следующая: если к порту ничего не подключено то проверка выполняется долго ~ 30-35сек. Не могу никак победить проблему, подскажите может кто сталкивался, реализовывал примерно такое.

Udev при нахождении платы расширения в компе сохраняет переменные окружения примерно так:
RS232_4_DEVICE=/dev/ttyS4
RS232_5_DEVICE=/dev/ttyS5


Далее скрипт:
#! /bin/sh

. $TS_GLOBAL

case "$1" in
    init)
        info_msg "Starting POS printer search... "
        for dev in 0 1 2 3 4 5 6 7 8 9; do
            if [ -n "`eval echo '$RS232_'$dev'_DEVICE'`" ] ; then
                device=`eval echo '$RS232_'$dev'_DEVICE'`
                # Проверяем порты на скоростях
                for speed in 19200 115200
                do
                    prn_found=0
                    #Устанавливаем на порту скорость и некоторые параметры
                    /bin/stty -F $device $speed raw -echo clocal crtscts cread &
                    #Когда на порту ничего нет, ждем и убиваем процесс stty
                    waitpid=$!
                    while kill -0 ${waitpid} 2>/dev/null ; do
                        sleep 1
                        /bin/kill -0 ${waitpid} 2>/dev/null
                        if [ $? -eq 0 ]; then
                            #Убиваем процесс, заканчиваем работу скрипта, похоже там ничего на пор ту не висит
                            kill ${waitpid} 2>/dev/null
                            break
                        else
                            #Процесса уже нет, есть вероятность что к порту подключено оборудование
                            #Редиректим вывод с порта в FD
                            exec 3<$device
                            #Редиректим вывод с FD в файл
                            /bin/cat <&3 > /tmp/ttyDump.dat &
                            #сохраняем PID для cat
                            PID=$!
                            #Посылаем команду в порт
                            printf "\x1d\x49\x43" > $device
                            #Ждем вывод
                            sleep 1
                            #Убиваем редирект cat
                            kill $PID
                            #Подавляем вывод "Terminated"
                            wait $PID 2>/dev/null
                            #освобождаем FD
                            exec 3<&-
                            AURA=`cat /tmp/ttyDump.dat | sed 's/_//g' | sed 's/^@//g'`
                            if [ -n "$AURA" ]; then
                                #Принтер отозвался на порту таком то и скорости такой то...
                                prn_found=1
                                logger -t $0 "POS printer model: AURA $AURA found on port $device speed $speed"
                                rm -rf /tmp/ttyDump.dat
                                # создаем символическую ссылку POSPRN для freerdp
                                for num in 0 1 2 3 4 5 6 7 8 9; do
                                    if [ -L /dev/POSPRN$num ] ; then
                                        if [ `readlink /dev/POSPRN$num` == $device ] ; then
                                            break;
                                        fi
                                    elif [ ! -L /dev/POSPRN$num ]; then
                                            ln -s $device /dev/POSPRN$num
                                            break;
                                    fi
                                done
                            else

                                logger -t $0 "POS printer model: AURA not found on port $device speed $speed"
                                rm -rf /tmp/ttyDump.dat
                            fi
                            break
                        fi
                    done
                    if [ "$prn_found" -eq "1" ]; then
                        #Если нашел принтер, прекращаю проверку по скоростям
                        success_msg "POS printer model: AURA $AURA found on port $device speed $speed"
                        break
                    fi
                done
            fi
        done
    ;;
    help)
        echo "Usage: $0 init"
    ;;
    *)
        exit 1
    ;;
esac

exit 0

Возможно можно оптимизировать некоторые блоки скрипта, критику приемлю

Ответить | Правка | Cообщить модератору

Оглавление
Как ускорить выполнения скрипта shell (проверка POS принтера), Pablic, 17-Авг-20, 16:23  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру