#!/bin/bash # # 1. The script issues shutdown command via the graceful shutdown command # If unsuccessful then it exits with 1. # 2. If the code is ok then it checks if jibri has exited. # 3. If not then it polls jibri statistics until recording status is not true # 4. Gives some time for jibri to shutdown. If it does not quit after that # time then it kills the process. If the process was successfully killed 0 is # returned and 1 otherwise. # # NOTE: script depends on the tool jq, used to parse json, and curl to access URLs # # Initialize arguments CURL_BIN="/usr/bin/curl" # URL for jibri status STATUS_URL="http://localhost:2222/jibri/api/v1.0/health" # URL to POST to signal jibri stop/cleanup STOP_URL="http://localhost:2222/jibri/api/v1.0/stopService" # wait this long before failing stop curl command STOP_TIMEOUT=3600 # wait this long before failing status curl command STATUS_TIMEOUT=30 # sleep this long between checking jibri status SLEEP_TIME=10 # delay shutdown AT MOST 6 hours = 21600 seconds TERMINATION_DELAY_TIMEOUT=21600 function getJibriStatus() { $CURL_BIN --max-time $STATUS_TIMEOUT $STATUS_URL 2>/dev/null } function stopJibri() { $CURL_BIN -H 'Content-Type: application/json' -d '{}' --max-time $STOP_TIMEOUT $STOP_URL 2>/dev/null } function isRecording() { STATUS=`getJibriStatus` echo $STATUS | jq -r ".status.busyStatus" } verbose=1 # Parse arguments OPTIND=1 while getopts "h:t:s" opt; do case "$opt" in h) STATUS_URL=$OPTARG ;; t) STATUS_TIMEOUT=$OPTARG ;; s) verbose=0 ;; esac done shift "$((OPTIND-1))" # Prints info messages function printInfo { if [ "$verbose" == "1" ] then echo "$@" fi } # Prints errors function printError { echo "$@" 1>&2 } function gracefulShutdownJibri() { /opt/jitsi/jibri/graceful_shutdown.sh } pid=$(/bin/systemctl show -p MainPID jibri 2>/dev/null | cut -d= -f2) echo -n "Graceful shutdown signal..." gracefulShutdownJibri shutdownStatus=$? echo "sent" if [ $shutdownStatus == 0 ]; then printInfo "Graceful shutdown started" recordingStatus=`isRecording` SLEEP_COUNT=0 while [[ $recordingStatus == "BUSY" ]]; do if [[ $SLEEP_COUNT -ge $TERMINATION_DELAY_TIMEOUT ]]; then printInfo "WAITED $TERMINATION_DELAY_TIMEOUT seconds, stopping jibri." # send signal to stop streaming/recording and upload any recordings pending stopJibri # mark jibri service as intentionally stopped to avoid restarts /usr/sbin/service jibri stop # stop looping break; fi printInfo "A recording is in progress" sleep $SLEEP_TIME SLEEP_COUNT=$(( $SLEEP_COUNT + $SLEEP_TIME )) recordingStatus=`isRecording` done sleep 5 # mark jibri service as intentionally stopped to avoid restarts /usr/sbin/service jibri stop if ps -p $pid > /dev/null 2>&1 then printInfo "It is still running, lets give it $STATUS_TIMEOUT seconds" sleep $STATUS_TIMEOUT if ps -p $pid > /dev/null 2>&1 then printError "Jibri did not exit after $STATUS_TIMEOUT sec - killing $pid" kill $pid else printInfo "Jibri shutdown OK" exit 0 fi else printInfo "Jibri shutdown OK" exit 0 fi # check for 3 seconds if we managed to kill for I in 1 2 3 do if ps -p $pid > /dev/null 2>&1 then sleep 1 fi done if ps -p $pid > /dev/null 2>&1 then printError "Failed to kill $pid" printError "Sending force kill to $pid" kill -9 $pid if ps -p $pid > /dev/null 2>&1 then printError "Failed to force kill $pid" exit 1 fi fi printInfo "Jibri shutdown OK" exit 0 else printError "Failed to signal shutdown of Jibri: $shutdownStatus" exit 1 fi