From 1fb308c6fa50667fa89e0c1faa0fbe7ad1ff6db1 Mon Sep 17 00:00:00 2001 From: Sergey Revyakin Date: Tue, 5 May 2026 17:41:42 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20systemd=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=20captu?= =?UTF-8?q?re=5Fhourly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- capture_hourly.sh | 92 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/capture_hourly.sh b/capture_hourly.sh index 83ebe7c..34d1166 100755 --- a/capture_hourly.sh +++ b/capture_hourly.sh @@ -40,6 +40,8 @@ CAPTURE_MOCK_LOG_SUCCESS="${CAPTURE_MOCK_LOG_SUCCESS:-0}" MOCK_SENDER_PID="" ACTIVE_CAPTURE_PID="" ACTIVE_MOCK_PID="" +ACTIVE_SERVICE_UNIT="" +SYSTEMCTL_BIN=(systemctl) ############################ # ЧАСТОТЫ И SERIAL ИЗ ENV @@ -50,6 +52,7 @@ ACTIVE_MOCK_PID="" ORDER=(1200) declare -A SERIAL declare -A FREQ_HZ +declare -A SERVICE_UNIT #SERIAL[433]="$hack_433" FREQ_HZ[433]="433000000" @@ -81,6 +84,17 @@ FREQ_HZ[5200]="5200000000" SERIAL[5800]="0000000000000000518864dc33743883" FREQ_HZ[5800]="5800000000" +SERVICE_UNIT[433]="dronedetector-sdr-433.service" +SERVICE_UNIT[750]="dronedetector-sdr-750.service" +SERVICE_UNIT[868]="dronedetector-sdr-868.service" +SERVICE_UNIT[915]="dronedetector-sdr-915.service" +SERVICE_UNIT[1200]="dronedetector-sdr-1200.service" +SERVICE_UNIT[2400]="dronedetector-sdr-2400.service" +SERVICE_UNIT[3300]="dronedetector-sdr-3300.service" +SERVICE_UNIT[4500]="dronedetector-sdr-4500.service" +SERVICE_UNIT[5200]="dronedetector-sdr-5200.service" +SERVICE_UNIT[5800]="dronedetector-sdr-5800.service" + ############################ # ВСПОМОГАТЕЛЬНОЕ ############################ @@ -89,6 +103,58 @@ log() { printf '[%s] %s\n' "$(date '+%F %T')" "$*" } +systemctl_run() { + "${SYSTEMCTL_BIN[@]}" "$@" +} + +service_exists() { + local unit="$1" + systemctl_run show "$unit" >/dev/null 2>&1 +} + +service_is_active() { + local unit="$1" + systemctl_run is-active --quiet "$unit" >/dev/null 2>&1 +} + +stop_band_service() { + local band="$1" + local unit="${SERVICE_UNIT[$band]:-}" + + ACTIVE_SERVICE_UNIT="" + if [[ -z "$unit" ]]; then + log "Для band=$band не найден service unit" + return 0 + fi + + if ! service_exists "$unit"; then + log "Service unit $unit не установлен, пропускаю stop/start" + return 0 + fi + + if ! service_is_active "$unit"; then + log "Service $unit не активен, stop/start не нужен" + return 0 + fi + + log "Останавливаю service $unit перед записью band=$band" + if ! systemctl_run stop "$unit"; then + log "Не удалось остановить service $unit" + return 1 + fi + ACTIVE_SERVICE_UNIT="$unit" +} + +start_active_service() { + if [[ -z "$ACTIVE_SERVICE_UNIT" ]]; then + return 0 + fi + + log "Запускаю service $ACTIVE_SERVICE_UNIT после записи" + systemctl_run start "$ACTIVE_SERVICE_UNIT" || log "Не удалось запустить service $ACTIVE_SERVICE_UNIT" + ACTIVE_SERVICE_UNIT="" +} + env_get() { local key="$1" local default="${2:-}" @@ -202,6 +268,7 @@ cleanup_active_jobs() { wait "$ACTIVE_CAPTURE_PID" 2>/dev/null || true fi stop_mock_sender "${ACTIVE_MOCK_PID:-}" + start_active_service exit "$rc" } @@ -228,6 +295,20 @@ ensure_requirements() { exit 1 fi + if ! command -v systemctl >/dev/null 2>&1; then + echo "Не найден systemctl" >&2 + exit 1 + fi + + if [[ "${EUID}" -ne 0 ]]; then + if command -v sudo >/dev/null 2>&1; then + SYSTEMCTL_BIN=(sudo systemctl) + else + echo "Для управления service нужен root или sudo" >&2 + exit 1 + fi + fi + mkdir -p "$BASE_DIR" local dev @@ -241,6 +322,11 @@ run_one_freq() { local serial="${SERIAL[$band]}" local freq="${FREQ_HZ[$band]}" + if [[ -z "$serial" ]]; then + log "Для band=$band пустой serial, пропускаю" + return 0 + fi + local ts out_dir log_file ts="$(date '+%F_%H-%M-%S')" out_dir="$BASE_DIR/$band/$ts" @@ -249,6 +335,9 @@ run_one_freq() { mkdir -p "$out_dir" log "Старт band=$band serial=$serial freq=$freq dir=$out_dir" + if ! stop_band_service "$band"; then + return 1 + fi "$PYTHON_BIN" "$SCRIPT_PATH" \ --serial "$serial" \ @@ -281,6 +370,7 @@ run_one_freq() { kill -TERM "$pid" 2>/dev/null || true wait "$pid" 2>/dev/null || true stop_mock_sender "$mock_pid" + start_active_service ACTIVE_CAPTURE_PID="" ACTIVE_MOCK_PID="" return 2 @@ -304,6 +394,7 @@ run_one_freq() { wait "$pid" 2>/dev/null || true stop_mock_sender "$mock_pid" + start_active_service ACTIVE_CAPTURE_PID="" ACTIVE_MOCK_PID="" break @@ -313,6 +404,7 @@ run_one_freq() { done stop_mock_sender "$mock_pid" + start_active_service ACTIVE_CAPTURE_PID="" ACTIVE_MOCK_PID="" log "Завершен band=$band, размер=$(du -sh "$out_dir" | awk '{print $1}')"