Автор Тема: Скрипт уровня сигнала. Добавить цикл из 5 попыток.  (Прочитано 3167 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн bboymig

  • Пользователь
  • *
  • Topic Author
  • Сообщений: 11
Есть небольшой скрипт, который выводит уровень сигнала. Если от модема не поступила информация, то выводит 0.
Помогите сделать условие. Если вышел 0, то запустить скрипт по новой. Если после 5 попытки вышел 0, то отправляем 0. Если вышло значение в любой из попытки, то отправляем значение.
Цитировать
echo -e "AT+CSQ\r\n" > /dev/ttyUSB0
sleep 1
gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113;RC=-1;exit} END {exit RC+1}' /dev/ttyUSB0 || echo 0
Прошу помощи, так как не знаю синтаксиса вообще.
 

Оффлайн endru

  • Главный модератор
  • Ветеран
  • *****
  • Сообщений: 1984
  • Новосибирск
может немного погуглить? обленились все в последнее время...
тебе поможет обычный цикл for, результат выполенения команды передаешь в переменную, например:
temp=`gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113;RC=-1;exit} END {exit RC+1}' /dev/ttyUSB0 || echo 0`после значение переменной можешь проверить условием, и если оно отлично от нуля - выходишь с выводом echo $temp
 
Пользователи, которые поблагодарили этот пост: bboymig

Оффлайн bboymig

  • Пользователь
  • *
  • Topic Author
  • Сообщений: 11
Цитировать
#!/bin/bash
i=5
if [i -ne 0] then i-1
echo -e "AT+CSQ\r\n" > /dev/ttyUSB0
sleep 1
temp=`gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113;RC=-1;exit} END {exit RC+1}' /dev/ttyUSB0 || echo 0`
if [$temp -ne 0] then echo $temp
else echo $temp
fi
« Последнее редактирование: 08 Сентябрь 2016, 12:54:44 от bboymig »
 

Оффлайн endru

  • Главный модератор
  • Ветеран
  • *****
  • Сообщений: 1984
  • Новосибирск
bboymig, а где сам цикл то?
for in in 1 2 3 4 5 #5 циклов
do
echo -e "AT+CSQ\r\n" > /dev/ttyUSB0
sleep 1
temp=`gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113;RC=-1;exit} END {exit RC+1}' /dev/ttyUSB0 || echo 0`
if [ "$temp" -ne "0" ]
 then
 echo $temp
 break #прерываем цикл
fi
done
 
Пользователи, которые поблагодарили этот пост: bboymig

Оффлайн bboymig

  • Пользователь
  • *
  • Topic Author
  • Сообщений: 11
Спасибо. Сам давно программированием занимался. Все уже забыл. Ассемблер и Паскаль.
 

Оффлайн bboymig

  • Пользователь
  • *
  • Topic Author
  • Сообщений: 11
Бывает при выполнении скрипта строчка   temp=`gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113;RC=-1;exit} END {exit RC+1}' /dev/ttyUSB0 || echo 0` зависает напрочь.
Скрипт изменил:
Цитировать
#!/bin/bash
temp="0";
i="0";
for i in {1..6}; do
  if [ $i -eq 6 ]; then
                   echo $temp;
                   break
                   fi
  if [ $i -lt 6 ]; then
  echo -e "AT+CSQ\r\n" > /dev/ttyUSB0
  cat /dev/ttyUSB0 > gsm.txt & sleep 1; pkill %cat;
  temp=`gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113;RC=-1;exit} END {exit RC+1}' gsm.txt || echo 0`
   if [ "$temp" -ne "0" ]
   then
   clear;
   echo $temp
   break #прерываем цикл
   fi
  fi
done
Проблема заключается в следующем. cat сразу же передает информацию в файл gsm.txt. Нельзя сделать так, чтобы cat в течении 1-2 секунды считывал всю информацию и полученную информацию отправлял в файл?

Пробовал сделать так:
Цитировать
#!/bin/bash
temp="0";
i="0";
for i in {1..6}; do
  if [ $i -eq 6 ]; then
                   echo $temp;
                   break
                   fi
  if [ $i -lt 6 ]; then
  echo -e "AT+CSQ\r\n" > /dev/ttyUSB0
  cat /dev/ttyUSB0 & sleep 2 & /dev/pts/0 > gsm.txt & pkill %cat;
  temp=`gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113;RC=-1;exit} END {exit RC+1}' gsm.txt || echo 0`
   if [ "$temp" -ne "0" ]
   then
   clear;
   echo $temp
   break #прерываем цикл
   fi
  fi
done
Выдает ошибку об отказе доступа:
Цитировать
line 11: /dev/pts/0: Отказано в доступе
chmod 777 /dev/pts/0
chown root:zabbix /dev/pts/0

Самое обидное, что крайнее решение задачи скорее всего не подойдет по причине вывода информации. И что делать я не знаю.
« Последнее редактирование: 10 Сентябрь 2016, 18:42:05 от bboymig »
 

Оффлайн vic5710

  • Местный житель
  • ***
  • Сообщений: 452
  • не умножайте сущностей сверх необходимых
Проблема заключается в следующем. cat сразу же передает информацию в файл gsm.txt. Нельзя сделать так, чтобы cat в течении 1-2 секунды считывал всю информацию и полученную информацию отправлял в файл?
tmp=$(mktemp)
for i in 1 2 3
do
 sleep 1
 cat /dev/ttyUSB0 >>$tmp
done
можно так
зачем тут pkill я не понял
cat /dev/ttyUSB0 & sleep 2 & /dev/pts/0 > gsm.txt & pkill %cat;
что эта строка делает?

Cообщение объединено 11 Сентябрь 2016, 00:17:43
тут похожий случай
cat у тебя будет висеть, пока не получит EOF, его тут применять сомнительно, нужно неблокирующее чтение
или запусти в фоне в начале
tmp=$mktemp) # create empty file
while true
do
sleep 1# 1 sec delay
 cat /dev/ttyUSB0 >> $tmp #дописываем данные в tmpfile
done & #запускаем в бесконечном цикле
если нужно очистить данные - echo > $tmp
погугли "linux open file non-block read", я когда-то на С делал, но не помню уже, ЕМНИП через <termios.h>

Cообщение объединено 11 Сентябрь 2016, 02:20:02
нашел в закромах
//read_tty.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h>

#define readsize 512
#define devname "/dev/ttyUSB0"
#define baudrate B115200

int main() {
    struct termios ts_old,ts_new;
    memset(&ts_old,0,sizeof(ts_old));
    memset(&ts_new,0,sizeof(ts_new));
    ts_new.c_cflag |= (baudrate | CS8 | CREAD | CLOCAL | HUPCL);
    ts_new.c_cflag &= ~(CRTSCTS | PARENB | PARODD);
    ts_new.c_iflag &= ~(IXON | IXOFF | IGNCR | ICRNL | ISTRIP | INLCR);
    ts_new.c_lflag &= ~(ICANON | ECHO);
    ts_new.c_oflag = 0;
    ts_new.c_cc[VMIN] = 0;
    ts_new.c_cc[VTIME] = 0;
    int count,fd;
    char buffer[readsize];
    fd = open(devname, O_RDONLY | O_NONBLOCK);
    if (fd < 0) {
fprintf(stderr,"error open file\n");
return -1;
    }
    tcgetattr(fd,&ts_old);
    tcsetattr(fd,TCSANOW,&ts_new);
    count = read(fd,buffer,readsize);
    tcsetattr(fd,TCSANOW,&ts_old);
    close(fd);
    if (count < 0) {
fprintf(stderr,"error read file\n");
return -1;
    }
    write(1,buffer,count);
    return 0;
}

« Последнее редактирование: 11 Сентябрь 2016, 02:20:02 от vic5710 »
 
Пользователи, которые поблагодарили этот пост: bboymig

Оффлайн bboymig

  • Пользователь
  • *
  • Topic Author
  • Сообщений: 11
Цитировать
#!/bin/bash
echo > gsm.txt
while true
do
sleep 0.5
cat /dev/ttyUSB0 >> gsm.txt
done &
temp="0";
i="0";
for i in {1..3}; do
  if [ $i -eq 3 ]; then
                   echo $temp;
                   break
                   fi
  if [ $i -lt 3 ]; then
   echo -e "AT+CSQ\r\n" > /dev/ttyUSB0
   temp=`gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113;RC=-1;exit} END {exit RC+1}' gsm.txt || echo 0`
   if [ "$temp" -ne "0" ]
   then
   clear;
   echo $temp
   break #прерываем цикл
   fi
  fi
done
Спасибо. В данном случае скрипт отрабатывает очень быстро. Я на работе еще на проблемном модеме проверю, очень надеюсь, что данный вопрос закроется.  :)
 

Оффлайн vic5710

  • Местный житель
  • ***
  • Сообщений: 452
  • не умножайте сущностей сверх необходимых
Я на работе еще на проблемном модеме проверю, очень надеюсь, что данный вопрос закроется. 
:o
Spoiler: ShowHide

я буду удивлен если будет так.
ты сам-то понял ,что написал?

учите матчасть
 
Пользователи, которые поблагодарили этот пост: bboymig

Оффлайн endru

  • Главный модератор
  • Ветеран
  • *****
  • Сообщений: 1984
  • Новосибирск
зачем вообще использовать cat для потока? есть же tail -f

Оффлайн vic5710

  • Местный житель
  • ***
  • Сообщений: 452
  • не умножайте сущностей сверх необходимых
зачем вообще использовать cat для потока? есть же tail -f
в смысле вместо cat /dev/* ? не знаю, не применял
 

Оффлайн bboymig

  • Пользователь
  • *
  • Topic Author
  • Сообщений: 11
Добрый день.
Алгоритм работает не так как надо. Это логично.
Цитировать
echo > gsm.txt
while true
do
sleep 0.5
cat /dev/ttyUSB0 >> gsm.txt
done &
Данный цикл не прекращает своей работы после выполнения скрипта. Можно было бы его закончить, после выполнения скрипта.

Пробовал сделать так:
Цитировать
#!/bin/bash
echo > gsm.txt
temp="0";
i="0";
for i in {1..5}; do
  if [ $i -eq 5 ]; then
                   echo $temp;
                   break
                   fi
  if [ $i -lt 5 ]; then
   echo -e "AT+CSQ\r\n" > /dev/ttyUSB0
   tail -f /dev/ttyUSB0 | tee gsm.txt &
   temp=`gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113;RC=-1;exit} END {exit RC+1}' gsm.txt || echo 0`
   if [ "$temp" -ne "0" ]
   then
   echo $temp
   break #прерываем цикл
   fi
  fi
done

tail -f выводит информацию, что не требуется. Все что выводится передается агенту zabbix.

Задача всего ничего. 100% гарантией считать полученную информацию с модема.
« Последнее редактирование: 12 Сентябрь 2016, 08:30:19 от bboymig »
 

Оффлайн vic5710

  • Местный житель
  • ***
  • Сообщений: 452
  • не умножайте сущностей сверх необходимых
tail -f /dev/ttyUSB0 | tee gsm.txt &
а так?
tail -f /dev/ttyUSB0 >> gsm.txt &
или
tail -f /dev/ttyUSB0 > gsm.txt &
 
Пользователи, которые поблагодарили этот пост: bboymig

Оффлайн bboymig

  • Пользователь
  • *
  • Topic Author
  • Сообщений: 11
Цитировать
#!/bin/bash
echo > gsm.txt
temp="0";
i="0";
for i in {1..5}; do
  if [ $i -eq 5 ]; then
                   echo $temp;
                   break
                   fi
  if [ $i -lt 5 ]; then
   echo -e "AT+CSQ\r\n" > /dev/ttyUSB0
   tail -f /dev/ttyUSB0 >> gsm.txt &
   temp=`gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113;RC=-1;exit} END {exit RC+1}' gsm.txt || echo 0`
   if [ "$temp" -ne "0" ]
   then
   echo $temp
   pkill tail
   break #прерываем цикл
   fi
  fi
done
Заработало. Единственный момент, как закрыть процесс без уведомления:
Цитировать
./gsm.sh: line 23:  7261 Завершено      tail -f /dev/ttyUSB0 >> gsm.txt
 

Оффлайн endru

  • Главный модератор
  • Ветеран
  • *****
  • Сообщений: 1984
  • Новосибирск
vic5710, как верно подметил bboymig выше, процессы в таком случае крутятся в фоне без завершения, а это опасно, можно повесить систему даже такими простыми скриптами...
если уж применяете:
tail -f /dev/ttyUSB0 >> gsm.txt &обязательно нужно смотреть какой pid у процесса! чтобы потом его спокойно убить:
tail -f /dev/ttyUSB0 >> gsm.txt &
mypid=`echo $!`
sleep 2
kill $mypid
 
Пользователи, которые поблагодарили этот пост: bboymig

Теги:
 

bash скрипт для распаковки архивов всех типов в указанную директорию

Автор demon_666_902

Ответов: 7
Просмотров: 7490
Последний ответ 19 Июль 2013, 00:53:11
от ZEN
bash скрипт и перенаправление ввода вывода заданное внутри скрипта

Автор zCirill

Ответов: 3
Просмотров: 2066
Последний ответ 07 Декабрь 2015, 23:19:39
от vic5710
[РЕШЕНО] Помогите склепать скрипт!

Автор }{ronoTrigger

Ответов: 14
Просмотров: 3239
Последний ответ 09 Июнь 2014, 12:49:15
от Alexey_F
bash скрипт для бесконечного парсинга лога

Автор zCirill

Ответов: 7
Просмотров: 4741
Последний ответ 12 Ноябрь 2013, 12:26:32
от zCirill
Bash скрипт замена одного слова

Автор Racer

Ответов: 2
Просмотров: 1341
Последний ответ 14 Декабрь 2016, 23:59:21
от }{ronoTrigger