Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Август 23, 2012, 17:09



Название: [РЕШЕНО] QProcess Linux run .sh скрипт
Отправлено: 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 рядом с исполняемым файлом.
Подскажите пожалуйста!


Название: Re: QProcess выполнить скрипт
Отправлено: kambala от Август 23, 2012, 17:15
папка SSL находится возле исполняемого файла?


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


Название: Re: QProcess выполнить скрипт
Отправлено: virtual_root от Август 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;
           }
       }
 
   }
}


Название: Re: QProcess выполнить скрипт
Отправлено: maint от Август 23, 2012, 18:00
вопрос один. А файлик исполнимый ? Для линуха, в отличии от винды расширение пофигу. Надо посмотреть в любом из файл-менеджеров есть у него атрибут "исполнимый" или "исполнить". Если нет, то или в менеджере, его средствами или с командной строки набрать chmod +x имя_файла


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


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


Название: Re: QProcess выполнить скрипт
Отправлено: virtual_root от Август 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;
   }
}
 


Название: Re: [РЕШЕНО] QProcess Linux run .sh скрипт
Отправлено: kambala от Август 24, 2012, 14:18
Код
C++ (Qt)
       QStringList console;
       console << "konsole" << "xterm";
а я и не заметил сначала этого в первом посте…


Название: Re: QProcess выполнить скрипт
Отправлено: Alex Custov от Август 24, 2012, 14:48
Разобралась. В Linux файлы .sh являются исполняемыми

не являются, "исполнимость" - это атрибут  файла, который можно поставить или убрать.


Название: Re: [РЕШЕНО] QProcess Linux run .sh скрипт
Отправлено: virtual_root от Август 24, 2012, 15:03
а как это сделать, подскажите?)


Название: Re: [РЕШЕНО] QProcess Linux run .sh скрипт
Отправлено: Serr500 от Август 24, 2012, 15:07
QFile::setPermissions и параметры QFile::ExeOwner, QFile::ExeUser, QFile::ExeGroup, QFile::ExeOther.


Название: Re: [РЕШЕНО] QProcess Linux run .sh скрипт
Отправлено: virtual_root от Август 25, 2012, 11:29
спасибо