#!/bin/sh # scan running process and run ffmpeg # for write video of xvfb session while true; do while ! [ -f "${ffmpeg_bin}" ] ; do ffmpeg_bin=$(find ~ -path */bin/ffmpeg -type f) echo ${ffmpeg_bin} [ -f "${ffmpeg_bin}" ] && break sleep 10 done ps -u $(id -u) -o pid= | \ while read pid; do display="" resolution="" test -d /proc/$pid || continue cat /proc/$pid/cmdline | tr '\0' '\n' | head -n1 | grep /bin/Xvfb\$ > /dev/null 2> /dev/null || continue for line in $(cat /proc/$pid/cmdline | tr '\0' '\n' 2> /dev/null); do if echo ${line} | grep -o ':[0-9]*' > /dev/null ; then display="${line}" fi if echo ${line} | grep -o '[0-9]*x[0-9]*x[0-9]*' > /dev/null ; then resolution="${line%x*}" fi done if [ -n "${display}" ] && [ -n "${resolution}" ]; then firefox_pid="" for f_pid in $(ps -u $(id -u) -o pid=); do test -d /proc/${f_pid} || continue cat /proc/${f_pid}/cmdline | tr '\0' '\n' | head -n1 | grep ./firefox\$ > /dev/null 2> /dev/null || continue cat /proc/${f_pid}/environ | tr '\0' '\n' | grep ^DISPLAY=${display}\$ > /dev/null 2> /dev/null || continue firefox_pid="$f_pid" break; done if [ -z "${firefox_pid}" ]; then continue fi filename="output${firefox_pid}.webm" test -f ${filename} && continue echo "xvfb ${pid} ${display} ${resolution}" echo "firefox ${firefox_pid}" export DISPLAY=${display} "${ffmpeg_bin}" -loglevel error -r 30 -s ${resolution} -f x11grab -i ${display}.0 \ -vf unpremultiply=inplace=1 \ -c:v libvpx-vp9 -lossless 1 \ -f webm ${filename} & ffmpeg_pid=$! sleep 5 if ! test -f ${filename} ;then kill ${ffmpeg_pid} continue fi echo run ffmpeg ${ffmpeg_pid} while true; do if ! [ -d "/proc/${firefox_pid}" ]; then echo "kill ffmpeg $ffmpeg_pid" kill ${ffmpeg_pid} exit fi sleep 0.2 done & fi done sleep 1 done