В общем, есть компьютеры к ним подключены чековые принтеры 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
Возможно можно оптимизировать некоторые блоки скрипта, критику приемлю