Problem
Podczas uruchamiania exec w perlu nie mogę przekierować danych wyjściowych do pliku.
Używam vlc w exec, ale ponieważ wątpię, czy wszyscy go skonfigurowali, zastąpiłem echo poniżej, pokazuje to samo zachowanie dla przykładu.
Interesuje mnie tylko exec „command”, „args” formatu exec, a nie ten, który tworzy powłokę, ponieważ tworzy podpowłokę z vlc, która nadal drukuje na ekranie + inne problemy z czystym zabijaniem.
Kod
use strict;
use warnings;
my $pid = fork;
if (!defined $pid) {
die "Cannot fork: $!";
}
elsif ($pid == 0) {
exec "/usr/bin/echo","done";
}
Wypróbowany
exec "/usr/bin/echo","done",">/dev/null";
Zgodnie z oczekiwaniami po prostu drukuje „> / dev / null”, ale warto było spróbować.
exec "/usr/bin/echo done >/dev/null";
Uruchamia sh, które następnie uruchamia echo, działa tutaj, ale nie w moim aktualnym problemie z vlc, myślałem, że i tak dołączę, ponieważ ktoś na pewno to zasugeruje.
Pytanie
Jak przekierować dane wyjściowe z tego exec przy użyciu polecenia „command”, „args” do pliku?
Dodatkowy
Wszelkie potrzebne informacje proszę pytać.
Odpowiedzi:
3 dla odpowiedzi № 1Okazuje się, że możesz po prostu zmienić deskryptory plików przed exec
use strict;
use warnings;
my $pid = fork;
if (!defined $pid) {
die "Cannot fork: $!";
}
elsif ($pid == 0) {
open STDOUT, ">", "/logger/log" or die $!;
open STDERR, ">", "/logger/log" or die $!;
exec "/usr/bin/echo","done";
}
0 dla odpowiedzi nr 2
Przypuszczam, że jeśli wystarczy wydrukować do pliku, powinno to działać.
najłatwiejszym sposobem przechwytywania danych wyjściowych jest użycie backticks.
use strict;
use warnings;
open (my $file, ">", "output.log");
my $pid = fork;
if (!defined $pid) {
die "Cannot fork: $!";
}
elsif ($pid == 0) {
print $file `/usr/bin/echo done`;
}