Запуск внешних программ

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Запуск внешних программ

Сообщение Сквозняк » 15.11.2012 07:34:22

Понадобилось собрать программу для виндовса и wine (сборка и тестирование из под вайна) и тут-то и обнаружилось что удобного fpsystem там нет, dos.exec не работает, SysUtils.ExecuteProcess генерирует ошибку 127, WinExec убрали, с ShellExecute не растёт кокос, как заставить Tprocess делать то что надо в вики не написано а гугл молчит в тряпочку.

Никакие навороты пока не нужны, надо получить аналог fpsystem но для винды. Пробую почти как в вики:
Код: Выделить всё
program launchprogram;

// Подключаем модули с требуемыми
// нам процедурами и функциями.
uses
   Classes, SysUtils, Process;

// Опишем переменную "AProcess"
// типа "TProcess"
var
   AProcess: TProcess;

// Здесь наша программа начинается
begin
   // Создаем объект  TProcess и
   // присваиваем его переменной AProcess.
   AProcess := TProcess.Create(nil);

   // Сообщим AProcess сомандную строку для запуска
   // Let's use the FreePascal compiler
   AProcess.CommandLine := 'hhhhhhhhhhhhhhhhhhhhhhh______________k';

   // Необходимо описать опции программы для запуска
   // Эта опция не позволит нашей программе выполнятся до тех пор, пока
   // запущенная программа не закончится
   AProcess.Options := AProcess.Options + [poWaitOnExit];

   // Теперь AProcess знает командную строку
   // и мы ее запускаем
   AProcess.Execute;

   // Пока ppc386 не прекратит работу, мы досюда не дойдем
   AProcess.Free;
writeln('exit');   
end.

И получаю:
Код: Выделить всё
An unhandled exception occurred at $0000000000463744 :
EProcess : Executable not found: "hhhhhhhhhhhhhhhhhhhhhhh______________k"
  $0000000000463744
  $000000000040026A

Как научить TProcess не валить по любому поводу программу?
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Запуск внешних программ

Сообщение SSerge » 15.11.2012 07:45:06

try ... except
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Запуск внешних программ

Сообщение Сквозняк » 15.11.2012 16:51:20

А поконкретнее можно?
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Запуск внешних программ

Сообщение evb87ar » 15.11.2012 17:42:43

Код: Выделить всё
begin
  try
    AProcess := TProcess.Create(nil);

    AProcess.CommandLine := 'hhhhhhhhhhhhhhhhhhhhhhh______________k';
    AProcess.Options := AProcess.Options + [poWaitOnExit];

    AProcess.Execute;
    AProcess.Free;

    writeln('exit');   
  except
    on e:exception do
      WriteLn('System error: ' +e.Message);
end.
Аватара пользователя
evb87ar
новенький
 
Сообщения: 52
Зарегистрирован: 18.01.2012 21:08:02
Откуда: г. Архангельск

Re: Запуск внешних программ

Сообщение Сквозняк » 15.11.2012 18:53:29

Код: Выделить всё
{$MODE OBJFPC}

uses
Classes, SysUtils, Process;

var
AProcess: TProcess;

begin
  try
    AProcess := TProcess.Create(nil);

    AProcess.CommandLine := 'hhhhhhhhhhhhhhhhhhhhhhh______________k';
    AProcess.Options := AProcess.Options + [poWaitOnExit];

    AProcess.Execute;
    AProcess.Free;

    writeln('exit');   
  except
    on e:exception do
      WriteLn('System error: ' +e.Message);
end.

Какая модная конструкция, но чего-то у неё для компиляции не хватает :?:
Код: Выделить всё
Compiling tpr2.pp
tpr2.pp(13,14) Warning: Symbol "CommandLine" is deprecated
tpr2.pp(23,4) Fatal: Syntax error, ";" expected but "." found
Fatal: Compilation aborted

И все равно, каждый раз нужен такой оверхед для простого вызова комманды системы - теперь понятно зачем нужно было менять двухъядерники на восьмиядерники.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Запуск внешних программ

Сообщение v-t-l » 15.11.2012 19:33:21

Код: Выделить всё
begin
  try
    ...
  except
    ...
  end;
end.
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Запуск внешних программ

Сообщение Сквозняк » 15.11.2012 22:51:17

Теперь заработало. И как люди живут в виндовсе с таким дурдомом и ещё говорят что он удобнее :? Живая иллюстрация анекдота девяностых "мазохист это программист в виндовсе": чтобы выполнить не exe а комманду системы, нужно передавать не 'set' а 'cmd.exe /c set' и так каждый раз.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Запуск внешних программ

Сообщение SSerge » 16.11.2012 05:59:56

Сквозняк, windows то тут причем, это конструкция из реализации библиотек fpc/lazarus. Что характерно, для других операционных систем оформление конструкции должно быть тем же самым.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Запуск внешних программ

Сообщение Сквозняк » 16.11.2012 18:09:52

Что характерно, для других операционных систем оформление конструкции должно быть тем же самым

Код: Выделить всё
fpsystem('rm имя файла');

Код: Выделить всё
// Демо-программа, показывающая, как можно запустить
// внешнюю программу
{$MODE FPC}
program launchprogram;

// Подключаем модули с требуемыми
// нам процедурами и функциями.
uses
   Classes, SysUtils, Process;

// Опишем переменную "AProcess"
// типа "TProcess"
var
   AProcess: TProcess;

// Здесь наша программа начинается
begin
   // Создаем объект  TProcess и
   // присваиваем его переменной AProcess.
   AProcess := TProcess.Create(nil);

   // Сообщим AProcess сомандную строку для запуска
   // Let's use the FreePascal compiler

AProcess.CommandLine := 'mkdir zzzzzzzzz';

writeln('_____________1_');

   // Необходимо описать опции программы для запуска
   // Эта опция не позволит нашей программе выполнятся до тех пор, пока
   // запущенная программа не закончится
   AProcess.Options := {AProcess.Options + }[poWaitOnExit{, poDefaultErrorMode}];

writeln('_____________2_');
   // Теперь AProcess знает командную строку
   // и мы ее запускаем
   AProcess.Execute;
writeln('_____________3_');
   // Пока ppc386 не прекратит работу, мы досюда не дойдем
   AProcess.Free;   
writeln('_____________4_');

end.

Как можно заметить, в линуксе перед использованием комманд баша не нужно запускать интерпритатор комманд, как там было в досе, уже точно не помню, но command.com каждый раз точно не запускал.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Запуск внешних программ

Сообщение skyler132 » 28.11.2012 17:19:02

Добрый день, помогите пожалуйста понять в чем баг?

Есть вот такой кусочек программы под Linux:
begin
launch:=tprocess.create(nil);
launch.commandline:='ssh root@192.168.0.1 -p22';
launch.options:=launch.options+[powaitonexit];
launch.execute;
launch.free;
end;

В виде командной строки просто пример, но вопрос именно по ней. Дело в том, что когда я в качестве имени пользователя указываю root, то на всех серверах (их более 30) все нормально, т.е. после выполнения я получаю полноценную удаленную консоль, но как только в качестве имени пользователя идет любой другой пользователь, то при коннекте я не могу видеть вводимых символов (при том, что все вводимые команды исполняются), при нажатии на ENTER без команды, строка дополнительная на появляется (как обычно в линуксе), а приглашение дублируется в одной горизонтальной строке, и также например, результат выполнения того же TOP инфу выводит через строку.

Пробовал сделать тоже самое, только вместо командной строки указывал: /bin/bash -c 'ssh test@192.168.0.1 -p22' - но эффект тот же.

Самое смешное, что если я пытаюсь руками приконнектиться к этому же серверу, ввожу в консоли туже команду, коннекчусь на сервер и таких проблем нет.

Подскажите пожалуйста, сталкивался кто-либо с подобным и есть ли другие компоненты для запуска внешних приложений под Linux.
skyler132
незнакомец
 
Сообщения: 2
Зарегистрирован: 28.11.2012 17:06:15

Re: Запуск внешних программ

Сообщение bormant » 28.11.2012 18:14:18

Сквозняк писал(а):в линуксе перед использованием комманд баша не нужно запускать интерпритатор комманд, как там было в досе

Ну-ну, уверены, что для использования встроенных команд bash-а не надо запускать сам bash?

Во-первых, про rm:
Код: Выделить всё
$ which rm
/usr/bin/rm
$ file /usr/bin/rm
/usr/bin/rm: symbolic link to `../../bin/rm'
$ file /bin/rm
/bin/rm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), stripped
Сюрприз? А rm-то вполне себе внешний бинарник и ни разу не встроенная команда ;)

А во-вторых, у bash тоже есть встроенные команды (man bash на предмет раздела "SHELL BUILTIN COMMANDS"). Если быть внимательным, можно заметить, что некоторые из встроенных команд продублированы внешними бинарниками, например,
Код: Выделить всё
$ which echo
/usr/bin/echo
$ file /usr/bin/echo
/usr/bin/echo: symbolic link to `../../bin/echo'
$ file /bin/echo
/bin/echo: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), stripped
Обычно, для встроенной команды disown внешнего бинарника не бывает:
Код: Выделить всё
$ which disown
which: no disown in (/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/lib64/qt/bin:.)
Вот и попробуйте её вызвать, минуя вызов bash ;-) Вот ровно также и с "cmd /c".
Аватара пользователя
bormant
постоялец
 
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Re: Запуск внешних программ

Сообщение stikriz » 28.11.2012 19:25:51

Сквозняк писал(а):И как люди живут в виндовсе с таким дурдомом и ещё говорят что он удобнее :?

Они дружат с мозгом.
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

Re: Запуск внешних программ

Сообщение skyler132 » 29.11.2012 12:25:22

skyler132 писал(а):Добрый день, помогите пожалуйста понять в чем баг?

Есть вот такой кусочек программы под Linux:
begin
launch:=tprocess.create(nil);
launch.commandline:='ssh root@192.168.0.1 -p22';
launch.options:=launch.options+[powaitonexit];
launch.execute;
launch.free;
end;

В виде командной строки просто пример, но вопрос именно по ней. Дело в том, что когда я в качестве имени пользователя указываю root, то на всех серверах (их более 30) все нормально, т.е. после выполнения я получаю полноценную удаленную консоль, но как только в качестве имени пользователя идет любой другой пользователь, то при коннекте я не могу видеть вводимых символов (при том, что все вводимые команды исполняются), при нажатии на ENTER без команды, строка дополнительная на появляется (как обычно в линуксе), а приглашение дублируется в одной горизонтальной строке, и также например, результат выполнения того же TOP инфу выводит через строку.

Пробовал сделать тоже самое, только вместо командной строки указывал: /bin/bash -c 'ssh test@192.168.0.1 -p22' - но эффект тот же.

Самое смешное, что если я пытаюсь руками приконнектиться к этому же серверу, ввожу в консоли туже команду, коннекчусь на сервер и таких проблем нет.

Подскажите пожалуйста, сталкивался кто-либо с подобным и есть ли другие компоненты для запуска внешних приложений под Linux.



Проблема локализована, если кому-нибудь будет интересно. Почему-то при коннекте не рутом слетают настройки терминала, скорее всего - это неправильные настройки на серверной стороне. Помогает сброс к дефолтным настройкам - в данном случае команда reset после коннекта, но пока удаленно её заслать не получается.
skyler132
незнакомец
 
Сообщения: 2
Зарегистрирован: 28.11.2012 17:06:15

Re: Запуск внешних программ

Сообщение Сквозняк » 30.11.2012 21:55:07

bormant писал(а):Ну-ну, уверены, что для использования встроенных команд bash-а не надо запускать сам bash?

В новых линуксах не надо - всё уже включено по умолчанию.
Сюрприз? А rm-то вполне себе внешний бинарник и ни разу не встроенная команда

Нет, не сюрприз, часть комманд именно встроенные - бинарника cd ни в /bin ни в /usr/bin не наблюдается.
Вот и попробуйте её вызвать, минуя вызов bash Вот ровно также и с "cmd /c"

Что там через что вызывается, дело десятое, важно что пишется в коммандной строке и на какой процесс введённые комманды действуют, а вот с этим у windows наблюдается регрессия по сравнению с dos.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Запуск внешних программ

Сообщение stikriz » 30.11.2012 22:32:26

Сквозняк писал(а):а вот с этим у windows наблюдается регрессия по сравнению с dos.

Использование команд из шелл поизучайте.
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru