Knihovna

Drobnosti pro zvědavé

Uživatelské nástroje

Nástroje pro tento web


knihovna:skripty:skript-indexace-na-vyzadani

INDEXACE HDD na vyžádání a povolení SKRIPT BASH Synology plánovač

požadavek:

Selektivní vypínání indexace jen pro HDD volumes aby mohly většinu času spát

Princip

#!/bin/bash
 
###############################################################################
# Název:      Indexace HDD bez narušení hibernace (DSM 7.2)
# Autor:      J + Copilot
#
# ÚČEL:
# Tento skript umožňuje, aby HDD (volume2, volume3, USB) na Synology mohly
# spolehlivě hibernovat. DSM běžně probouzí HDD kvůli indexaci, což brání
# úspornému režimu. Skript proto:
#
#   1) Dočasně přidá HDD složky do indexeru
#   2) Spustí kompletní indexaci
#   3) Sleduje /var/log/synoindex.log a čeká na "done"
#   4) Po dokončení složky z indexeru odebere
#   5) Pošle DSM notifikaci
#
# Výsledek:
#   HDD se indexují jen tehdy, když chceš (ručně nebo časovačem).
#   Jinak DSM HDD neskenuje → disky mohou hibernovat.
#
# OCHRANY:
#   - Lock file: zabrání dvojímu spuštění skriptu
#   - Kontrola, zda už neběží indexace (proces synoindexd)
#   - Logování na SSD (volume1), aby se HDD neprobouzely
#
# Doporučené použití:
#   Spouštět ručně nebo pomocí Plánovače úloh (např. 1× týdně / měsíčně).
###############################################################################
 
# -----------------------------------------
# Nastavení
# -----------------------------------------
LOGDIR="/volume1/ZPRAVY_Systemu"
DATE=$(date +"%Y-%m-%d_%H-%M")
LOGFILE="$LOGDIR/indexace_$DATE.log"
INDEXLOG="/var/log/synoindex.log"
LOCKFILE="$LOGDIR/index.lock"
 
mkdir -p "$LOGDIR"
echo "===== START INDEXACE $(date) =====" >> "$LOGFILE"
 
# -----------------------------------------
# Ochrana proti dvojímu spuštění
# -----------------------------------------
if [ -f "$LOCKFILE" ]; then
    echo "[ERROR] Skript už běží (lock file existuje): $LOCKFILE" >> "$LOGFILE"
    exit 1
fi
 
touch "$LOCKFILE"
 
# -----------------------------------------
# Kontrola, zda už neběží indexace
# -----------------------------------------
if pgrep -x "synoindexd" >/dev/null 2>&1; then
    echo "[ERROR] Indexace už probíhá (proces synoindexd běží) – skript končí" >> "$LOGFILE"
    rm -f "$LOCKFILE"
    exit 1
fi
 
# -----------------------------------------
# Seznam HDD/USB složek k indexaci
# -----------------------------------------
SHARES="
/volume2/cesta1
/volume2/cesta2
 
/volume3/VOL3-cesta3
/volume3/VOL3-cesta4
/volumeUSB1/usbshare1
"
 
SHARES_CLEAN=$(echo "$SHARES" | sed '/^\s*$/d')
 
echo "[INFO] Složky k indexaci:" >> "$LOGFILE"
echo "$SHARES_CLEAN" >> "$LOGFILE"
 
# -----------------------------------------
# Přidání složek do indexeru
# -----------------------------------------
echo "[INFO] Přidávám složky do indexu" >> "$LOGFILE"
 
while read -r DIR; do
    [ -z "$DIR" ] && continue
    if [ -d "$DIR" ]; then
        echo "[ADD] $DIR" >> "$LOGFILE"
        /usr/syno/bin/synoindex -A "$DIR" >> "$LOGFILE" 2>&1
    else
        echo "[MISS] $DIR (adresář neexistuje)" >> "$LOGFILE"
    fi
done <<< "$SHARES_CLEAN"
 
# -----------------------------------------
# Spuštění reindexace
# -----------------------------------------
echo "[INFO] Spouštím reindexaci (synoindex -R all)" >> "$LOGFILE"
/usr/syno/bin/synoindex -R all >> "$LOGFILE" 2>&1
 
# -----------------------------------------
# Čekání na dokončení indexace (log /var/log/synoindex.log)
# -----------------------------------------
echo "[INFO] Čekám na dokončení indexace (sledování $INDEXLOG)..." >> "$LOGFILE"
 
if [ ! -f "$INDEXLOG" ]; then
    echo "[WARN] Log $INDEXLOG neexistuje – nelze sledovat stav indexace" >> "$LOGFILE"
else
    START_LINE=$(wc -l < "$INDEXLOG")
 
    while true; do
        sleep 10
        NEW_LINES=$(sed -n "$((START_LINE+1)),\$p" "$INDEXLOG")
        if echo "$NEW_LINES" | grep -qi "done"; then
            echo "[INFO] V logu indexace nalezeno 'done' – indexace považována za dokončenou" >> "$LOGFILE"
            break
        fi
    done
fi
 
echo "[INFO] Indexace dokončena (nebo nelze dále sledovat)" >> "$LOGFILE"
 
# -----------------------------------------
# Odebrání složek z indexeru
# -----------------------------------------
echo "[INFO] Odebírám složky z indexu" >> "$LOGFILE"
 
while read -r DIR; do
    [ -z "$DIR" ] && continue
    if [ -d "$DIR" ]; then
        echo "[DEL] $DIR" >> "$LOGFILE"
        /usr/syno/bin/synoindex -D "$DIR" >> "$LOGFILE" 2>&1
    fi
done <<< "$SHARES_CLEAN"
 
# -----------------------------------------
# Notifikace DSM
# -----------------------------------------
/usr/syno/bin/synodsmnotify @administrators "Indexace HDD + USB dokončena"
 
echo "===== HOTOVO $(date) =====" >> "$LOGFILE"
 
# -----------------------------------------
# Úklid lock file
# -----------------------------------------
rm -f "$LOCKFILE"

Takže čekání na dokončení uděláme takto:

  • spustíme indexaci
  • každých 10 sekund zkontrolujeme, zda se v logu objevil nový „done“
  • jakmile ano → indexace skončila
  • To funguje vždy, bez ohledu na PATH, bez pgrep, bez procesů.

🕒 Doporučené nastavení v Task Scheduleru

  • User: root
  • Trigger: weekly → 03:00
  • Enabled: yes
  • Run command: vložit skript výše

použitá verze:

knihovna/skripty/skript-indexace-na-vyzadani.txt · Poslední úprava: autor: JJC