На моем сервера (Debian squeeze 6 AMD64) под wine работают 2 серверных консольных приложения. Запускаю их обычно с SSH с помощью perl скрипта (совместил несколько образцов давным давно), что бы не зависеть от ssh сессий, и писать вывод в файл (фактически получается лог работы приложения).
Но, как я понял, пишет в файл он какими-то кусками, причём если приложение аварийно завершилось, последний кусок не вписывается (а он-то как раз нужнее всех), а если приложение было закрыто совсем быстро, так выходной файл вообще оказывался пуст.
вот мой скрипт:
#!/usr/bin/perl
use POSIX qw(setsid);
chdir '*рабочая директория приложений*' or die "Can't chdir to /: $!";
umask 0;
($sec, $min, $hour, $day, $month, $year) = (localtime)[0..5];
my $dt=($year+1900).'-'.($month+1).'-'.$day.'_'.$hour.':'.$min.':'.$sec.'.log';
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, '>out_'.$dt or die "Can't write to stdout: $!";
open STDERR, '>er_'.$dt or die "Can't write to stderr: $!";
defined(my $pid = fork) or die "Can't fork: $!";
exit if $pid;
setsid or die "Can't start a new session: $!";
system("wine приложение1.exe &");
system("wine приложение2.exe &");
1 - поставить $| = 1;
я пробовал ставить во все места кода, в конце концов вставил между всех строк:
#!/usr/bin/perl
use POSIX qw(setsid);
$| = 1;
chdir '*рабочая директория приложений*' or die "Can't chdir to /: $!";
umask 0;
($sec, $min, $hour, $day, $month, $year) = (localtime)[0..5];
my $dt=($year+1900).'-'.($month+1).'-'.$day.'_'.$hour.':'.$min.':'.$sec.'.log';
$| = 1;
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
$| = 1;
open STDOUT, '>out_'.$dt or die "Can't write to stdout: $!";
$| = 1;
open STDERR, '>er_'.$dt or die "Can't write to stderr: $!";
$| = 1;
defined(my $pid = fork) or die "Can't fork: $!";
exit if $pid;
setsid or die "Can't start a new session: $!";
$| = 1;
system("wine приложение1.exe &");
$| = 1;
system("wine приложение2.exe &");
$| = 1;
другой вариант -
если вас не пугают последствия, вообще запретите буферизацию вызовом метода autoflush из модулей IO: use IO::Handle; OUTPUT_HANDLE->autoflush(1);
увы тоже не подошёл (вставил с 2й строки):
Can't locate object method «autoflush» via package «OUTPUT_HANDLE» (perhaps you forgot to load «OUTPUT_HANDLE»?) at tstart.pl line 3.
такие вот последствия, и никакого запуска, разумеется.
Огромная просьба помочь с решением этой проблемы вывода