Open source webový aplikační framework Django slaví 20. narozeniny.
V Brestu dnes začala konference vývojářů a uživatelů linuxové distribuce Debian DebConf25. Na programu je řada zajímavých přednášek. Sledovat je lze online.
Před 30 lety, tj. 14. července 1995, se začala používat přípona .mp3 pro soubory s hudbou komprimovanou pomocí MPEG-2 Audio Layer 3.
Výroba 8bitových domácích počítačů Commodore 64 byla ukončena v dubnu 1994. Po více než 30 letech byl představen nový oficiální Commodore 64 Ultimate (YouTube). S deskou postavenou na FPGA. Ve 3 edicích v ceně od 299 dolarů a plánovaným dodáním v říjnu a listopadu letošního roku.
Společnost Hugging Face ve spolupráci se společností Pollen Robotics představila open source robota Reachy Mini (YouTube). Předobjednat lze lite verzi za 299 dolarů a wireless verzi s Raspberry Pi 5 za 449 dolarů.
Dnes v 17:30 bude oficiálně vydána open source počítačová hra DOGWALK vytvořena v 3D softwaru Blender a herním enginu Godot. Release party proběhne na YouTube od 17:00.
McDonald's se spojil se společností Paradox a pracovníky nabírá také pomocí AI řešení s virtuální asistentkou Olivii běžící na webu McHire. Ian Carroll a Sam Curry se na toto AI řešení blíže podívali a opravdu je překvapilo, že se mohli přihlásit pomocí jména 123456 a hesla 123456 a získat přístup k údajům o 64 milionech uchazečů o práci.
Byla vydána (𝕏) červnová aktualizace aneb nová verze 1.102 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.102 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Byla vydána nová verze 2.4.64 svobodného multiplatformního webového serveru Apache (httpd). Řešeno je mimo jiné 8 bezpečnostních chyb.
Společnost xAI na síti 𝕏 představila Grok 4, tj. novou verzi svého AI LLM modelu Grok.
Ř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: