Zmęczyłem się uruchamianiem 8 poleceń równolegle, aby w pełni wykorzystać procesor i przyspieszyć konwersje wideo, coś takiego:
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/b.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/c.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/d.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/e.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/f.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/g.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/h.mp4 > /dev/null 2>&1 &
2 do 3 z nich zostaje zatrzymanych. Dlaczego to się dzieje? Czy to ograniczenie FFmpeg? Próbowałem tego na 16 i 4 rdzeniowych maszynach, EC2 c1.xlarge i cc2.8xlarge. Takie samo zachowanie. Próbowałem skomplikowanych poleceń i prostych, wciąż takich samych, 2 lub 3 zostały zatrzymane.
ffmpeg
multi-core
multi-processor
d33pika
źródło
źródło
Odpowiedzi:
Odpowiadając na pierwotne pytanie, dlaczego niektóre zadania się zatrzymują, ffmpeg w wierszu poleceń jest interaktywny. Ciągle odczytuje dane z wiersza poleceń. Aby uruchomić je wszystkie w tle, zmień to:
do tego:
dodanie polecenia
</dev/null
mówi ffmpeg, aby nie szukał danych wejściowych, a wszystkie zadania powinny działać w tle.źródło
> /dev/null 2>/dev/null
.Tylko myśl na twój rozkaz: o wiele łatwiejszym sposobem wbijania maszyny w jedno polecenie jest łączenie wszystkiego w jedną linię:
Możesz dodać (w zależności od wersji ffmpeg) flagę informującą serwer o użyciu wszystkich dostępnych procesorów
Dla odniesienia: http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs
źródło