OpenSearch (Wikipedie) byl vydán ve verzi 3.0. Podrobnosti v poznámkách k vydání. Jedná se o fork projektů Elasticsearch a Kibana.
PyXL je koncept procesora, ktorý dokáže priamo spúštat Python kód bez nutnosti prekladu ci Micropythonu. Podľa testov autora je pri 100 MHz približne 30x rýchlejší pri riadeni GPIO nez Micropython na Pyboard taktovanej na 168 MHz.
Grafana (Wikipedie), tj. open source nástroj pro vizualizaci různých metrik a s ní související dotazování, upozorňování a lepší porozumění, byla vydána ve verzi 12.0. Přehled novinek v aktualizované dokumentaci.
Raspberry Pi OS, oficiální operační systém pro Raspberry Pi, byl vydán v nové verzi 2025-05-06. Přehled novinek v příspěvku na blogu Raspberry Pi a poznámkách k vydání. Pravděpodobně se jedná o poslední verzi postavenou na Debianu 12 Bookworm. Následující verze by již měla být postavena na Debianu 13 Trixie.
Richard Stallman dnes v Liberci přednáší o svobodném softwaru a svobodě v digitální společnosti. Od 16:30 v aule budovy G na Technické univerzitě v Liberci. V anglickém jazyce s automaticky generovanými českými titulky. Vstup je zdarma i pro širokou veřejnost.
sudo-rs, tj. sudo a su přepsáné do programovacího jazyka Rust, nahradí v Ubuntu 25.10 klasické sudo. V plánu je také přechod od klasických coreutils k uutils coreutils napsaných v Rustu.
Fedora se stala oficiální distribucí WSL (Windows Subsystem for Linux).
Společnost IBM představila server IBM LinuxONE Emperor 5 poháněný procesorem IBM Telum II.
Byla vydána verze 4.0 multiplatformního integrovaného vývojového prostředí (IDE) pro rychlý vývoj aplikaci (RAD) ve Free Pascalu Lazarus (Wikipedie). Přehled novinek v poznámkách k vydání. Využíván je Free Pascal Compiler (FPC) 3.2.2.
Podpora Windows 10 končí 14. října 2025. Připravovaná kampaň Konec desítek (End of 10) může uživatelům pomoci s přechodem na Linux.
Řešení dotazu:
sudo -u $DAEMONUSER ffmpeg -loglevel quiet -i $source -vn ... \ -f mpegts - | sudo -u $DAEMONUSER ffmpeg -loglevel quiet \ -f mpegts -i - -c copy ... $dst $index \ -f mpegts -c copy -f mpegts udp://@$udp_dst & echo $! > $PIDFILE
${PIPESTATUS[@]}
což vám vrátí všechny PID procesů, které jsou spojené rourou. Ty pak pozabíjíte jedním killnutím.
Bez bashe je zjištění všech PID složitější -- vyžaduje větší znalost file deskriptorů. Přičemž bude takové řešení výrazně nepřehlednější (pokud to má být stále one-liner). Další způsob (méně spolehlivý) je: zjistit poslední PID pomocí !$ (tak jak to máte) a pomocí utilitky ps a programu awk nebo sed si vytáhnout všechny PID u stejného subprocesu.
( ffmpeg..|ffmpeg.. )& echo $!
Nevím proč mi to nenapadlo dřív :).
# cat /var/run/ffmpeg/109.pid 28767
28767 ? S 0:00 /bin/sh /etc/init.d/ffmpeg-hls-restream startVypadá to takto:
28767 ? S 0:00 /bin/sh /etc/init.d/ffmpeg-hls-restream start 28768 ? S 0:00 \_ sudo -u vlc /usr/local/bin/ffmpeg -loglevel quiet -i udp://@... 28769 ? S 0:00 \_ /usr/local/bin/ffmpeg -loglevel quiet -f mpegts -i - -c copy ...Po killu 28767 zmizí jen ten jeden řádek, ale ty ffmpegy si žijou dál. Divný. :(
start-stop-daemon --stop --signal 9 --oknodo --pidfile "$PIDFILE" --exec /usr/local/bin/ffmpeg
Předpokládám, že sudo využíváš pouze pro přepnutí na jiného uživatele. Místo sudo bych použil přímo start-stop-daemon a ffmpeg rouru by jsem spouštěl ze skriptu $DAEMON_WRAPPER:
start-stop-daemon --start --quiet --pidfile $PIDFILE
--chuid $DAEMONUSER --background --make-pidfile --exec $DAEMON_WRAPPER -- $ARGS
Vše poté zabiješ pomocí:
pkill -P $(cat $PIDFILE)
Proměná $ARGS se využívá k předání parametrů skriptu $DAEMON_WRAPPER, je na tobě co všechno mu budeš předávat. Wrapper bude zajišťovat spuštění pouze jedné instace ffmpeg roury, v init.d skriptu máš cyklus for, který postupně spouští X různých instací. Závorky zruš, stejně jako sudo a ukládání PID do PIDFILE na konci roury, to zařídí start-stop-daemon. Pod pojmem "ffmpeg roura" mám na mysli (tj. celou jednu instaci):
FFMPEG1 PARAM_1 PARAM_N |FFMPEG2 PARAM_2 PARAM_N
start-stop-daemon zařídí forknutí wrapperu na pozadí, spuštění pod definovaným uživatelem, vytvoření $PIDFILE, kde bude PID právě tohoto forknutého wrapperu, ve kterém budeš spouštět ffmpeg rouru bez přesunu na pozadí (tj. žádný ampersand na konci roury), ffmpeg roura má jako rodiče právě wrapper, takže když pozabíjíš jeho potomky, máš vyřešeno. Ano, uděláš to příkazem pkill místo "start-stop-daemon --stop", protože rodič se ukončí sám, jakmile budou pozabíjeni potomci, protože nedělá nic jiného než, že čeká na jejich dokončení. Na vhodném místě si ještě smaž PIDFILE, třeba v init.d skriptu po pozabíjení potomků. Můžeš jim nejprve poslat SIGTERM, vyčkat, sjistit pomocí pgrep zda-li ještě potomci běží a případně jim poslat SIGKILL, pokud budou běžet i po uplynutí definované doby.
$ man start-stop-daemon
Ne, takto jsem to vůbec nemyslel. Psal jsem, ať si uděláš skript $DAEMON_WRAPPER, do kterého vložíš spouštění ffmpeg a případné potřebné argumenty mu předáš pomocí proměné $ARG. Možná ti níže uvedený fragment pomůže v pochopení jak jsem to myslel.
# vim init.d/ffmpeg-hls-restream
...
DAEMON_WRAPPER=/usr/local/bin/ffmpeg_wrapper.sh
...
do_start() {
...
start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid $DAEMONUSER --background --make-pidfile --exec $DAEMON_WRAPPER -- $ARGS
...
do_stop() {
...
pkill -P $(cat $PIDFILE)
...
# vim /usr/local/bin/ffmpeg_wrapper.sh
...
if [ $vcodec ]; then
/usr/local/bin/ffmpeg -loglevel quiet -i $source -flags -global_header -profile:v baseline -c:v $vcodec -b:v $bitrate -maxrate $vbvmaxrate -bufsize $vbvbufsize \
-deinterlace -vf "crop=in_w$vcrop:in_h$vcrop,scale=$width:$height" -keyint_min $keyint_min -g $gop -c:a $acodec -b:a $abitrate -ar $asrate \
-f mpegts - | /usr/local/bin/ffmpeg -loglevel quiet \
-f mpegts -i - -c copy -hls_time $seglen -hls_list_size $numsegs -hls_base_url $index_url -hls_flags delete_segments -hls_segment_filename $dst $index \
-f mpegts -c copy -f mpegts udp://@$udp_dst
...
ffmpeg ... | ffmpeg .... | ffmpeg ... & ps -o "%p %c" --no-headers --ppid $$ | sed -n '/ffmpeg\|vlc/{s/ffmpeg//;s/vlc//;p}' | tr -d '\n' > pid.txt
Řešení s file deskriptory bych vám také mohl nabídnout, ale jelikož to máte stejně ve skriptu, který spouštíte (tj. máte rodiče a jeho pid se nechá získat pomocí $$), není nutné to hned hrotit :); tohle by mělo vrátit co potřebujete. Stačit by mělo už jen kill -9 $(cat pid.txt).
Tiskni
Sdílej: