LINUX.ORG.RU

Возвращение результата Bash скрипта в Си


0

1

Здравствуйте уважаемые форумчане. Краткое предисловие: Есть серверная убунта, установлен motion - детектор движения, записывает и шлет смски если залезли воры (реализовано скриптами). Первоначально запускал через cron. Выявились некоторые сложности в использовании: не всегда охраняемое помещение закрывается по расписанию, кароче понадобилось ручное управление. Сделал кнопку прикрутил ее к LPT порту + два светодиода для отображения режима работы. Планировалось следующее: при старте системы загорается красный светодиод, motion (запускается через bash) остановлен. Если нажать кнопку то загорается зеленый, тухнет красный и запускается motion. Для всего вышеописанного написал код на си. Система реагирует на кнопку и переключает лампочки. Собственно вопрос - При нажатии кнопки программа должна выяснить запущена ли служба (motion) или нет. накорябал скрипт который это проверяет и возвращает 1 или 0 на bash (ps | greep | wc) а как прикрутить вывод башевого скрипта в си код что то не разберусь. Кто в теме, откликнитесь. Заранее спасибо за помощь.

написал код на си

Что за код на С? Демон? Если демон, то пиши результат баш-скрипта в файл, а из С-программы оттуда читай. По таймеру или c помощью inotify

anonymous
()

скрипт который это проверяет и возвращает 1 или 0 на bash (ps | greep | wc)

омг, юзай pidof или pgrep

zolden ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

проверяет и возвращает 1 или 0 на bash

Имхо речь именно о $?

UPD: даже если не так, то стоит привести к такому виду.

arturpub ★★
()
Последнее исправление: arturpub (всего исправлений: 1)
Ответ на: комментарий от Vinill

Вчера ночью ковырял system(), вроде бы дело пошло, нужно будет проверить все точно, сейчас в экстренном порядке учу ТБ при работе в электроустановках 2014 г. По сравнению с ней Керниган и Ритчи детская литература. Попробовал заменить конструкцию (ps |grep|wc) на pgrep, с наскока что то не получилось. Функция при наличии процесса возвращает Pid, если нету тогда 0, я правильно понимаю? Пока это не демон, запускаю из консоли. Поначалу думал запускать из крон, но чаще 1 раза в минуту без костылей не сделаешь, поэтому нужно реализовывать в виде демона, в свободные минуты читаю маны, что народ посоветовал.

zampolit
() автор топика

Вот тут есть пример: watch (мой древний велосипед)

В краце: popen и WEXITSTATUS().

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

Использовал system(«pidof motion»), вроде бы получилось. Работает как ожидалось, но код сырой, нужно будет допиливать. pgrep и (ps|grep|wc)результата не дали, при вызове выводили целый ворох информации, хотя когда подставлял другую команду, например top все работало. Также motion необходимо переводить в режим демона, править конфиг /etc/motion/motion.conf в самом начале и запускать без опции -n. Привожу код, сильно не ругайте, можно сказать это дебют, если не считать хелоу вордов и всякой мелочи. Комментариев почти нету, если в кратце вначале инициализация LPT порта и прочая подготовка. Проверка условий начиается в цикле while (1) там все просто. Кому интересно, могу выложить распайку порта и кнопки.

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/io.h>

#define BASE 0x378

#define STATUS 0x379

#define TIME 100000

#define BASEPORT 0x378

int main()

{ int off=0x00;

int green=0x0F;

int red=0x10;

int key;

if (ioperm (BASE,1,1))

{perror («ioperm()»);

exit (77);

}

if (ioperm (STATUS,1,1))

{perror («ioperm()»);

exit (77);

}

outb (off, BASE);

//sleep 10;

outb (red, BASE);

while (1) //Unlimite cikle

{

if (inb(STATUS)==94) //Butom is ON?

{

if (system («pidof motion») != 0)//motion is run?

{

outb (green, BASE);

printf («green\n»);

system («sudo motion»);

sleep(2);

}

else

{

outb (red, BASE);

printf («red\n»);

system («sudo killall motion»);

sleep(2);

}

}

}

}

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