Russian Qt Forum
Ноябрь 24, 2024, 16:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QProcess Linux run .sh скрипт  (Прочитано 10228 раз)
virtual_root
Гость
« : Август 23, 2012, 17:09 »

Добрый день ребята! Подскажите пожалуйста, как мне под Linux(kUbuntu) выполнить скрипт .sh программно?
Я написала такую функцию:
Код
C++ (Qt)
CertAndKey GenerateCert(TypeClient type,unsigned int day,qint32 id){
 
   if (QFile::exists("./SSL/CreateGrabberKey.sh")) {
 
       QStringList console;
       console << "konsole" << "xterm";
 
       QString script = "./SSL/CreateGrabberKey.sh";
       QStringList args;
       args << script;
 
       foreach (QString process, console) {
           qDebug()<<process;
           QProcess * p = new QProcess();
           p->start(process,args);
           if (p->waitForStarted()) {
               break;
           } else {
               p->close(); qDebug()<<"no..";
               delete p;
           }
       }
 
   }
}
Консоль она запускает, но скрипт почему-то не исполняется и даже никаких попыток исполнения я не вижу, соответственн и результат от выполненого скрипта(должен появиться файл) нету...
Запускала скрипт просто в консоли, он прекрасно отрабатывает без ошибок.
Может надо какой-то путь особый добавить? Ведь скрипт находится у меня в папке SSL рядом с исполняемым файлом.
Подскажите пожалуйста!
« Последнее редактирование: Август 24, 2012, 12:06 от tiny developer » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Август 23, 2012, 17:15 »

папка SSL находится возле исполняемого файла?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
virtual_root
Гость
« Ответ #2 : Август 23, 2012, 17:20 »

да. Я подправила так:
Код:
QString script = QApplication::applicationDirPath()+QDir::separator()+"SSL/CreateGrabberKey.sh";
но скрипт всё равно не исполняется... может надо какую-то команду Linux использовать?
Записан
virtual_root
Гость
« Ответ #3 : Август 23, 2012, 17:39 »

изменила немного код, но всё равно скрипт не выполняется...
Как мне хоть какой-то вывод получить? А то консоль совсем пустая запускается...
Код
C++ (Qt)
CertAndKey GenerateCert(TypeClient type,unsigned int day,qint32 id){
 
   if (QFile::exists("./SSL/CreateGrabberKey.sh")) {
 
       QStringList console;
       console << "konsole" << "xterm";
 
       QString script = QApplication::applicationDirPath()+QDir::separator()+"SSL/CreateGrabberKey.sh %1 %2";
 
       switch (type){
           case Viewer:{ script = script.arg(QString::number(day),+"Viewer_"+QString::number(id)); break;}
           case Grabber:{ script = script.arg(QString::number(day),+"Grabber_"+QString::number(id)); break;}
           case Node: { script = script.arg(QString::number(day),+"Node_"+QString::number(id)); break;}
       default: { script = script.arg(QString::number(day),+"Undefined_"+QString::number(id)); break;}
       }
 
 
       qDebug()<<script;
       QStringList args;
       args << script;
 
       foreach (QString process, console) {
           qDebug()<<process;
           QProcess * p = new QProcess();
           p->start(process,args);
           if (p->waitForStarted()) {
               p->waitForReadyRead();
               qDebug() << p->readAllStandardOutput();
               break;
           } else {
               p->close(); qDebug()<<"no..";
               delete p;
           }
       }
 
   }
}
Записан
maint
Гость
« Ответ #4 : Август 23, 2012, 18:00 »

вопрос один. А файлик исполнимый ? Для линуха, в отличии от винды расширение пофигу. Надо посмотреть в любом из файл-менеджеров есть у него атрибут "исполнимый" или "исполнить". Если нет, то или в менеджере, его средствами или с командной строки набрать chmod +x имя_файла
Записан
Aluman
Гость
« Ответ #5 : Август 24, 2012, 08:22 »

Я c linux не очень хорошо знаю, но насколько мне известно скрипты в linux выполняет bash. Именно ему и нужно передавать скрипт на выполнение. Скорей всего как-то так /bin/bash bash [опции] [файл],  где [опции] - необходимый ключи (ключи можно посмотреть тут http://opennet.ru/man.shtml?topic=bash&category=1), а [файл] - путь к скрипту.
« Последнее редактирование: Август 24, 2012, 08:26 от Aluman » Записан
virtual_root
Гость
« Ответ #6 : Август 24, 2012, 10:40 »

подправила права на файлы и с bash пробовала всё равно не выходит...
что интересно запускаю процесс с такой строкой:
Код:
"konsole cd /home/urivskay/QtProjects/RunScriptLinux/SSL/; ./CreateGrabberKey.sh 30 Viewer_2" 
и в консоли вижу такую ошибку:
Код:
Ошибка сегментирования (core dumped)
Если эту же строку(без слова konsole - оно процессу нужно) просто выполнить в консоли, то всё ок!
В чем же у меня причина? Почему не хочет через процесс выполнять скрипт? Привана папку SSL и файлы 777
Записан
virtual_root
Гость
« Ответ #7 : Август 24, 2012, 12:05 »

Разобралась. В Linux файлы .sh являются исполняемыми и поэтому вовсе не нужно в качестве программы процессу передавать консоль.
Сделала так и всё работает!
Код
C++ (Qt)
CertAndKey GenerateCert(TypeClient type,unsigned int day,qint32 id){
 
   QString base = QApplication::applicationDirPath()+"/SSL";
   QString script;
 
   QStringList args;
   switch (type){
   case Viewer:
   {
       args<<QString::number(day) << "Viewer_"+QString::number(id);
       script = base + "/CreateManagerKey.sh";
       break;
   }
   case Grabber:
   {
       args<<QString::number(day) << "Grabber_"+QString::number(id);
       script = base + "/CreateGrabberKey.sh";
       break;
   }
 
   case Node:    {
       args<<QString::number(day) << "Node_"+QString::number(id);
       script = base + "/CreateNodeKey.sh";
       break;
   }
 
   default:
       qCritical()<< "wtf?";
       abort();
       break;
   }
   qDebug()<<base << script << args;
 
   QProcess proc;
   proc.setWorkingDirectory(base);
   proc.start(script, args);
 
   int exitCode = -3;
   if(proc.waitForFinished(-1))
   {
       exitCode = proc.exitCode();
   }
 
 
   switch(exitCode)
   {
   case 0:
       qDebug()<< "generator script ok:" << exitCode;
       break;
   default:
   case -1:
   case -2:
       qCritical()<< "generator script failed:" << exitCode;
       qDebug() << "ERR" << proc.readAllStandardError();
       qDebug() << "OUT" << proc.readAllStandardOutput();
       break;
   }
}
 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Август 24, 2012, 14:18 »

Код
C++ (Qt)
       QStringList console;
       console << "konsole" << "xterm";
а я и не заметил сначала этого в первом посте…
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Август 24, 2012, 14:48 »

Разобралась. В Linux файлы .sh являются исполняемыми

не являются, "исполнимость" - это атрибут  файла, который можно поставить или убрать.
Записан
virtual_root
Гость
« Ответ #10 : Август 24, 2012, 15:03 »

а как это сделать, подскажите?)
Записан
Serr500
Гость
« Ответ #11 : Август 24, 2012, 15:07 »

QFile::setPermissions и параметры QFile::ExeOwner, QFile::ExeUser, QFile::ExeGroup, QFile::ExeOther.
Записан
virtual_root
Гость
« Ответ #12 : Август 25, 2012, 11:29 »

спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.133 секунд. Запросов: 23.