Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
zenit-alex
0 / 0 / 0
Регистрация: 25.04.2014
Сообщений: 9
1

Весь день ломаю голову над QProcess, не стартует скрипт

29.04.2014, 15:56. Просмотров 1094. Ответов 12
Метки нет (Все метки)

Всем привет. Весь день ломаю голову над такой проблемой...
С Qt работаю совсем недавно, так что не судите строго! Пишу программу, смысл которой заключается в том, чтобы сформировать скрипты, на основе заполненных данных в форме, а потом их(его) выполнить.
Проблема заключается в том, что некоторые скрипты успешно выполняются из программы, а некоторые нет. А если запустить собственноручно скрипт, не из программы! То все отлично запустится и выполняется...
Привожу пример кода функции, которая работает:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void MainWindow::onDbDump()
{
           Dialog_save_name *dialog_save_name = new Dialog_save_name(this);
                if (dialog_save_name->exec() == 1) {
                QString scrRoot("ssh root@");
                QString scrBody(" \"pg_dump -U postgres ");
                QString scrBodyKov("\"");
                QString scrBodyName = dialog_save_name->leName();
                QString scrBodyDir(qApp->applicationDirPath() + "/dumps/");
                QString ipAdress = ui->leIpDb->text();
                QFile file("db_dump.sh");
                    if (file.open(QFile::WriteOnly | QFile::Text))
                     {
                        QTextStream out(&file);
                        out.setCodec("CP1251");
                        out << "#!/bin/bash" << "\n" << "\n";
                            for (int i=0; i<ui->treeWidgetDb->topLevelItemCount(); i++) {
                               QTreeWidgetItem *rootItem = ui->treeWidgetDb->topLevelItem(i);
 
                               if (rootItem->checkState(0) == Qt::Checked) {
                                out << scrRoot << ipAdress << scrBody << rootItem->text(0) 
                            << scrBodyKov << " > " << scrBodyDir << scrBodyName << ".sql";
                                    }
                              }
                       }
                            file.close();
    }
    delete dialog_save_name;
    processDb->start(qApp->applicationDirPath() + "/db_dump.sh");
    processDb->waitForFinished(-1);
}
А вот функция, из которой скрипт не выполняется:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void MainWindow::onPbCreateDb()
{
    Dialog_createdb *dialog_createdb = new Dialog_createdb(this);
 
        if (dialog_createdb->exec() == 1) {
 
            QString scrRoot("ssh root@");
            QString ipAdress = ui->leIpDb->text();
            QString scrCreatedb(" createdb "); 
            QString scrBodyName = dialog_createdb->leName();
            QString scrBodyPath = dialog_createdb->lePath();
            QString scrBody(" -U postgres");
            QString scrBodyDump(" -U postgres -d ");
 
            QFile file("start.sh");
                if (file.open(QFile::WriteOnly | QFile::Text))
                 {
                    QTextStream out(&file);
                    out.setCodec("CP1251");
                    out << "#!/bin/bash" << "\n" << "\n";
                    out << scrRoot << ipAdress << scrCreatedb << scrBodyName << scrBody << "\n";
                    out << "psql -h " << ipAdress << scrBodyDump << scrBodyName 
                    << " -f " << scrBodyPath;
                }
                        file.close();
    }
        delete dialog_createdb;
        processDbDump->start(qApp->applicationDirPath() + "/start.sh");
        processDbDump->waitForFinished(-1);
 
}
Не могу понять, почему в одном случае, скрипт из программы запускается, а в другом нет. Причем сам processDbDump завершается якобы успешно, но ничего не происходит! Заранее спасибо...
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2014, 15:56
Ответы с готовыми решениями:

Ломаю голову над логикой
Доброе время суток Появилось интересное задание, не хватает опыта решить. Есть...

Ломаю голову над задачей
В общем в программировании полный ноль. Буду очень благодарен. Спасибо :)...

Написать программу по C++. Уже второй день голову ломаю...
Задание в общем понятное(вложенный файл C_PP.gif), но черт голову сломаешь как...

Помогите пожалуйста с UART, ломаю голову уже целый день((
Привет. Задача такая. Нужно послать по UART строку, хранящуюся во флеше(при...

Мне нужно всего лишь найти синтаксические ошибки, второй день ломаю голову, в условии есть ошибки
Мне нужно всего лишь найти синтаксические ошибки, второй день ломаю голову, в...

12
schdub
Эксперт С++
3038 / 1380 / 421
Регистрация: 19.01.2009
Сообщений: 3,685
Завершенные тесты: 1
29.04.2014, 16:29 2
В первом случае команда pg_dump и ее аргументы в кавычках, во втором createdb и ее аргументы без кавычек.
0
zenit-alex
0 / 0 / 0
Регистрация: 25.04.2014
Сообщений: 9
29.04.2014, 16:44  [ТС] 3
Цитата Сообщение от schdub Посмотреть сообщение
В первом случае команда pg_dump и ее аргументы в кавычках, во втором createdb и ее аргументы без кавычек.
Пробовал в кавычках, но это не помогло(
Есть еще функция, которая формирует скрипт, и начинается с команды - dropdb и точно такая же история...из программы скрипт не стартует! А руками, пожалуйста, все работает! Т.е. команды в нем правильные
0
schdub
Эксперт С++
3038 / 1380 / 421
Регистрация: 19.01.2009
Сообщений: 3,685
Завершенные тесты: 1
29.04.2014, 16:53 4
Вам действительно через скрипты нужно делать? может в конкретном случае выполнить два процесса последовательно. Так ошибки каждого процесса можно будет проверить.

не кажется, что start.sh так нагляднее генерировать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#if (1)
    QString ipAdress    = ui->leIpDb->text();
    QString scrBodyName = dialog_createdb->leName();
    QString scrBodyPath = dialog_createdb->lePath();
#else
    QString ipAdress    = "192.168.0.1";
    QString scrBodyName = "dbName";
    QString scrBodyPath = "dbPath";
#endif
 
    QFile file("start.sh");
    if (file.open(QFile::WriteOnly | QFile::Text)) {
        QTextStream out(&file);
        out.setCodec("CP1251");
        out << QString("#!/bin/bash\n\n"
                       "ssh root@ %1 \"createdb -U postgress %2\"\n"
                       "psql -h %1 -U postgres -d %2 -f %3")
                .arg(ipAdress)
                .arg(scrBodyName)
                .arg(scrBodyPath);
        file.close();
    }
0
RazrFalcon
1386 / 1243 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
29.04.2014, 16:55 5
Покажите что у вас за файл в итоге получается.
0
Чистый
Автор FAQ
2713 / 1409 / 89
Регистрация: 08.09.2011
Сообщений: 3,741
Записей в блоге: 1
29.04.2014, 16:58 6
у вас скрипт не является исполняемым, вы либо предварительно делайте
Bash
1
 chmod +x start.sh
либо запускайте так:
C++ (Qt)
1
processDbDump->start("sh " + qApp->applicationDirPath() + "/start.sh");
0
zenit-alex
0 / 0 / 0
Регистрация: 25.04.2014
Сообщений: 9
29.04.2014, 16:59  [ТС] 7
Цитата Сообщение от schdub Посмотреть сообщение
Вам действительно через скрипты нужно делать? может в конкретном случае выполнить два процесса последовательно. Так ошибки каждого процесса можно будет проверить.
Да в общем-то без разницы, в скрипте выполнять их или как-то по другому) просто для меня было так наглядней, что есть на выходе! Я пробовал выполнять для начала только первую команду - ssh root@ip_adress createdb db_name -U postgres
но и ее он не выполняет!
0
schdub
Эксперт С++
3038 / 1380 / 421
Регистрация: 19.01.2009
Сообщений: 3,685
Завершенные тесты: 1
29.04.2014, 17:04 8
Цитата Сообщение от zenit-alex Посмотреть сообщение
ssh root@ip_adress createdb db_name -U
а попробуйте
Bash
1
ssh root@ip_adress "createdb db_name -U postgress"
0
zenit-alex
0 / 0 / 0
Регистрация: 25.04.2014
Сообщений: 9
29.04.2014, 17:08  [ТС] 9
Цитата Сообщение от Чистый Посмотреть сообщение
у вас скрипт не является исполняемым, вы либо предварительно делайте
В том то и дело, что является, я один раз руками chmod сделал и теперь они всегда исполняемые...

Добавлено через 3 минуты
Цитата Сообщение от schdub Посмотреть сообщение
а попробуйте
Код Bash
1
ssh root@ip_adress "createdb db_name -U postgress"
Пробовал, все то же самое(
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Покажите что у вас за файл в итоге получается
В файле получается вот что

Bash
1
2
3
#!/bin/bash
 
ssh root@208.28.0.2 createdb 123qwerty -U postgres
0
Чистый
Автор FAQ
2713 / 1409 / 89
Регистрация: 08.09.2011
Сообщений: 3,741
Записей в блоге: 1
29.04.2014, 17:12 10
zenit-alex,
покажите вывод
Bash
1
ls -l
после того как его перезапишет программа ваша
0
zenit-alex
0 / 0 / 0
Регистрация: 25.04.2014
Сообщений: 9
29.04.2014, 17:25  [ТС] 11
Цитата Сообщение от schdub Посмотреть сообщение
не кажется, что start.sh так нагляднее генерировать?
Конечно наглядней, я же говорю, что совсем новичок! Около двух месяцев)

Цитата Сообщение от Чистый Посмотреть сообщение
покажите вывод
Код Bash
1
ls -l
Вот вывод:
Bash
1
2
3
4
5
6
7
8
кжрър 188
-rwxrwxrwx 1 root root     99 Втф 11 11:46 db_dump.sh
-rwxrwxrwx 1 root root     60 Втф 11 17:24 del.sh
drwxrwxrwx 2 root root   4096 Втф 11 11:47 dumps
drwxrwxrwx 2 root root   4096 Втф 10 09:11 icons
-rwxrwxrwx 1 root root    980 Втф 18  2014 programs.xml
-rwxr-xr-x 1 root root 154949 Втф 11 18:07 ref
-rwxrwxrwx 1 root root     66 Втф 11 18:10 start.sh
0
schdub
Эксперт С++
3038 / 1380 / 421
Регистрация: 19.01.2009
Сообщений: 3,685
Завершенные тесты: 1
29.04.2014, 18:47 12
Лучший ответ Сообщение было отмечено zenit-alex как решение

Решение

zenit-alex, вот набросал пример запуска скрипта, может переделаете под свои нужды:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    QString script("start.sh");
    QFile file(script);
    if (file.open(QFile::WriteOnly | QFile::Text)) {
        QTextStream out(&file);
        out.setCodec("CP1251");
        out << QString("#!/bin/bash\n\n%1\n").arg("ls /tmp");
        file.close();
    }
    QProcess proc;
    proc.setWorkingDirectory(qApp->applicationDirPath());
    proc.start("sh", QStringList() << script);
    proc.waitForFinished(-1);
 
    qDebug() << proc.readAll();
Добавлено через 13 минут
Т.е. должно получится что-то типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void MainWindow::onPbCreateDb() {
    Dialog_createdb dialog_createdb(this);
    if (dialog_createdb->exec() != 1) {
        return;
    }
 
    QString script("start.sh");
    QString curDir(qApp->applicationDirPath());
    QFile file(script);
    if (!file.open(QFile::WriteOnly | QFile::Text)) {
        qDebug() << "can't open script file" << script;
        return;
    }
 
    QString ipAdress    = ui->leIpDb->text();
    QString scrBodyName = dialog_createdb->leName();
    QString scrBodyPath = dialog_createdb->lePath();
    QTextStream out(&file);
    out.setCodec("CP1251");
    out << QString("#!/bin/bash\n\n"
                   "ssh root@%1 \"createdb -U postgress %2\"\n"
                   "psql -h %1 -U postgres -d %2 -f %3")
        .arg(ipAdress)
        .arg(scrBodyName)
        .arg(scrBodyPath);
    file.close();
 
    QProcess proc;
    proc.setWorkingDirectory(curDir);
    proc.start("sh", QStringList() << script);
    proc.waitForFinished(-1);
 
    qDebug() << proc.readAll();
}
2
zenit-alex
0 / 0 / 0
Регистрация: 25.04.2014
Сообщений: 9
30.04.2014, 11:46  [ТС] 13
Цитата Сообщение от schdub Посмотреть сообщение
Т.е. должно получится что-то типа:
Спасибо тебе schdub, очень сильно выручил и все получилось!) Я думаю все дело было в том, что QProcess ты запускал с аргументами..
0
30.04.2014, 11:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2014, 11:46

Месяц голову ломаю
Имеется таблица mysql aw_info, в ней идут колонки id userid username ...

ломаю голову с перемычками
здравствуйте. взял себе нов. диск на 1 тв. и при установке возник вопрос нужны...

Аналитическая геометрия. Ломаю голову
Буду очень признателен, если поможете с решением этой задачи... хотя бы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru