ubuntu
カテゴリ
Midnight Commander (mc) メニューカスタマイズ
2026/04/24 17時maintenance
■menuファイルを置換えてメニューの追加設定
mc メニューにダイアログを表示させる「dialog」の、インストール
which dialog || sudo apt install dialog -y

menu ファイルの作成
nano ~/.config/mc/menu
c       Chown to 1000:1000 (Recursive)
        TARGET="%p"
        dialog --yesno "以下を再帰的に 1000:1000 に変更しますか?\n\n${TARGET}" 9 60
        if [ $? -eq 0 ]; then
            RESULT=$(sudo chown -R 1000:1000 "${TARGET}" 2>&1)
            if [ $? -eq 0 ]; then
                dialog --msgbox "変更しました:\n${TARGET}" 7 60
            else
                dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
            fi
        fi
        clear

x       chmod +x (実行権限付与)
        TARGET="%p"
        dialog --yesno "以下に実行権限(+x)を付与しますか?\n\n${TARGET}" 9 60
        if [ $? -eq 0 ]; then
            RESULT=$(sudo chmod +x "${TARGET}" 2>&1)
            if [ $? -eq 0 ]; then
                dialog --msgbox "実行権限を付与しました:\n${TARGET}" 7 60
            else
                dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
            fi
        fi
        clear

H       HLS管理
        CHOICE=$(dialog --menu "HLS管理" 14 50 4 \
            h "BS-NHK 起動(約90秒後に視聴可能)" \
            o "BS-NHK 停止" \
            j "BS-NHK → サブチャンネル切替" \
            k "キャッシュクリア(BS-NHK 再起動)" \
            3>&1 1>&2 2>&3)
        case $CHOICE in
            h)
                RESULT=$(sudo systemctl start hls-bs1 2>&1)
                if [ $? -eq 0 ]; then
                    dialog --msgbox "HLS BS-NHKを起動しました\n約90秒後に視聴可能です" 7 45
                else
                    dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
                fi
                ;;
            o)
                RESULT=$(sudo systemctl stop hls-bs1 2>&1)
                if [ $? -eq 0 ]; then
                    dialog --msgbox "HLS BS-NHKを停止しました" 6 40
                else
                    dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
                fi
                ;;
            j)
                RESULT=$(sudo systemctl stop hls-bs1 2>&1; sudo systemctl start hls-bs2 2>&1)
                STATUS=$?
                if [ $STATUS -eq 0 ]; then
                    dialog --msgbox "BS-NHK⇒サブ切替が完了しました" 6 45
                else
                    dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
                fi
                ;;
            k)
                dialog --yesno "HLS BS-NHKを再起動してキャッシュをクリアします\n視聴中の場合は約90秒切断されます。続行しますか?" 8 55
                if [ $? -eq 0 ]; then
                    RESULT=$(sudo systemctl stop hls-bs1 2>&1)
                    sleep 5
                    RESULT2=$(sudo systemctl start hls-bs1 2>&1)
                    if [ $? -eq 0 ]; then
                        dialog --msgbox "キャッシュクリア完了\n約90秒後に視聴可能になります" 7 45
                    else
                        dialog --msgbox "エラーが発生しました:\n\n${RESULT2}" 8 60
                    fi
                fi
                ;;
        esac
        clear

v       TV予約確認
        RESULT=$(curl -s "http://localhost:8888/api/reserves?limit=5&isHalfWidth=true" | python3 /mnt/data/backup/scripts/tv_reserves.py)
        echo "$RESULT" | dialog --programbox "TV予約確認" 15 60
        clear

p       コンテナ起動確認・自動復旧
        RESULT=$(/mnt/data/backup/scripts/check_containers.sh 2>&1)
        echo "$RESULT" | dialog --programbox "コンテナ起動確認・自動復旧" 20 60
        clear

R       コンテナ再起動
        CHOICE=$(dialog --menu "コンテナ再起動" 17 55 6 \
            A "AdGuard Home" \
            e "EPGStation(録画中チェック付)" \
            m "Mirakurun + EPGStation(録画中チェック付)" \
            f "vafee2-lounge" \
            i "Immich" \
            u "Uptime Kuma" \
            g "Golf App" \
            3>&1 1>&2 2>&3)
        case $CHOICE in
            A)
                RESULT=$(docker restart adguardhome 2>&1)
                if [ $? -eq 0 ]; then
                    dialog --msgbox "AdGuard Home を再起動しました\n\n${RESULT}" 8 50
                else
                    dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 50
                fi
                ;;
            e)
                RECORDING=$(curl -s "http://localhost:8888/api/recording?limit=1&isHalfWidth=true" | python3 -c "import sys,json; print(json.load(sys.stdin).get('total',0))")
                if [ "$RECORDING" -gt 0 ]; then
                    dialog --msgbox "録画中のためスキップしました" 6 40
                else
                    RESULT=$(docker restart epgstation 2>&1)
                    if [ $? -eq 0 ]; then
                        dialog --msgbox "EPGStation を再起動しました\n\n${RESULT}" 8 50
                    else
                        dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 50
                    fi
                fi
                ;;
            m)
                RECORDING=$(curl -s "http://localhost:8888/api/recording?limit=1&isHalfWidth=true" | python3 -c "import sys,json; print(json.load(sys.stdin).get('total',0))")
                if [ "$RECORDING" -gt 0 ]; then
                    dialog --msgbox "録画中のためスキップしました" 6 40
                else
                    RESULT=$(docker restart mirakurun 2>&1)
                    if [ $? -eq 0 ]; then
                        dialog --msgbox "Mirakurun を再起動しました\n\n${RESULT}\n\n1分後にEPGStationを再起動します\n(この画面は自動で閉じます)" 10 55
                        sleep 60
                        RESULT2=$(docker restart epgstation 2>&1)
                        if [ $? -eq 0 ]; then
                            dialog --msgbox "EPGStation を再起動しました\n\n${RESULT2}\n\nEPG反映まで数分かかります" 9 55
                        else
                            dialog --msgbox "EPGStation 再起動でエラーが発生しました:\n\n${RESULT2}" 8 55
                        fi
                    else
                        dialog --msgbox "Mirakurun 再起動でエラーが発生しました:\n\n${RESULT}" 8 55
                    fi
                fi
                ;;
            f)
                RESULT=$(cd /mnt/data/docker/Python/vafee2_project && docker compose restart 2>&1)
                if [ $? -eq 0 ]; then
                    dialog --msgbox "lounge を再起動しました\n\n${RESULT}" 8 50
                else
                    dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 50
                fi
                ;;
            i)
                RESULT=$(docker restart immich_server immich_microservices 2>&1)
                if [ $? -eq 0 ]; then
                    dialog --msgbox "immich を再起動しました\n\n${RESULT}" 8 50
                else
                    dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 50
                fi
                ;;
            u)
                RESULT=$(docker restart uptime-kuma 2>&1)
                if [ $? -eq 0 ]; then
                    dialog --msgbox "Uptime Kuma を再起動しました\n\n${RESULT}" 8 50
                else
                    dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 50
                fi
                ;;
            g)
                RESULT=$(cd /mnt/data/docker/golf_app && docker compose restart 2>&1)
                if [ $? -eq 0 ]; then
                    dialog --msgbox "Golf App を再起動しました\n\n${RESULT}" 8 50
                else
                    dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 50
                fi
                ;;
        esac
        clear

w       スワップ使用量確認
        RESULT=$(free -h && echo "---" && for i in /proc/*/status; do awk '/VmSwap|Name/{printf $2 " "}' $i; echo; done | sort -k2 -rn | head -10)
        echo "$RESULT" | dialog --programbox "スワップ使用量" 20 60
        clear

t       タスクスケジューラ
        sudo crontab -e
        clear

E       エンコード管理
        CHOICE=$(dialog --menu "エンコード管理" 18 55 6 \
            s "状態確認・CPU警告チェック" \
            p "エンコード一時停止" \
            r "エンコード再開" \
            k "エンコード強制停止" \
            l "エンコードレポート生成" \
            e "ファイルを再エンコード" \
            3>&1 1>&2 2>&3)
        case $CHOICE in
            s)
                IDLE=$(top -bn1 | grep "^%Cpu" | awk '{print $8}' | cut -d. -f1)
                ENC=$(pgrep -f qsvencc 2>/dev/null)
                JLS=$(pgrep -f jls_process 2>/dev/null)
                if [ "${IDLE}" -le 5 ]; then
                    WARN="警告: idle 5%以下!録画失敗リスクあり"
                elif [ "${IDLE}" -le 10 ]; then
                    WARN="注意: idle 10%以下"
                else
                    WARN="正常"
                fi
                ENC_MSG="qsvencc: ${ENC:-停止中}"
                JLS_MSG="jls_process: ${JLS:-停止中}"
                dialog --msgbox "CPU idle: ${IDLE}%  ${WARN}\n\n${ENC_MSG}\n${JLS_MSG}" 10 55
                ;;
            p)
                ENC=$(pgrep -f qsvencc 2>/dev/null)
                JLS=$(pgrep -f jls_process 2>/dev/null)
                if [ -z "${ENC}" ] && [ -z "${JLS}" ]; then
                    dialog --msgbox "エンコード中のプロセスがありません" 6 45
                else
                    [ -n "${ENC}" ] && kill -STOP ${ENC}
                    [ -n "${JLS}" ] && kill -STOP ${JLS}
                    dialog --msgbox "エンコードを一時停止しました" 6 45
                fi
                ;;
            r)
                ENC=$(pgrep -f qsvencc 2>/dev/null)
                JLS=$(pgrep -f jls_process 2>/dev/null)
                if [ -z "${ENC}" ] && [ -z "${JLS}" ]; then
                    dialog --msgbox "停止中のプロセスがありません" 6 45
                else
                    [ -n "${ENC}" ] && kill -CONT ${ENC}
                    [ -n "${JLS}" ] && kill -CONT ${JLS}
                    dialog --msgbox "エンコードを再開しました" 6 45
                fi
                ;;
            k)
                ENC=$(pgrep -f qsvencc 2>/dev/null)
                JLS=$(pgrep -f jls_process 2>/dev/null)
                if [ -z "${ENC}" ] && [ -z "${JLS}" ]; then
                    dialog --msgbox "エンコード中のプロセスがありません" 6 45
                else
                    dialog --yesno "エンコードを強制停止しますか?" 6 45
                    if [ $? -eq 0 ]; then
                        [ -n "${ENC}" ] && kill -9 ${ENC}
                        [ -n "${JLS}" ] && kill -9 ${JLS}
                        dialog --msgbox "エンコードを強制停止しました" 6 40
                    fi
                fi
                ;;
            l)
                RESULT=$(python3 /mnt/data/backup/scripts/generate_report.py 2>&1)
                echo "$RESULT" | dialog --programbox "エンコードレポート生成" 8 60
                ;;
            e)
                TS=$(eval echo "%d/%f")
                if [ -n "${TS}" ] && [ -f "${TS}" ]; then
                    AUTO_CH=$(bash /mnt/data/backup/scripts/get_channel.sh "${TS}")
                    CH=$(dialog --inputbox "チャンネル名を入力\n例: テレビ朝日 / WOWOWプライム" 8 60 "${AUTO_CH}" 3>&1 1>&2 2>&3)
                    if [ -n "${CH}" ]; then
                        BASENAME=$(basename "${TS}" .ts)
                        dialog --yesno "以下を再エンコードしますか?\n\n${BASENAME}\nCH: ${CH}" 9 65
                        if [ $? -eq 0 ]; then
                            LOG_FILE=$(bash /mnt/data/backup/scripts/reencode.sh "${TS}" "${CH}")
                            dialog --msgbox "再エンコード開始しました\n\n${BASENAME}\nCH: ${CH}\nログ: ${LOG_FILE}" 9 70
                        fi
                    fi
                else
                    dialog --msgbox "ファイルが見つかりません:\n${TS}" 7 60
                fi
                ;;
        esac
        clear
              

C       CPU温度・使用率確認
        RESULT=$(echo "=== CPU温度 ===" && sensors 2>/dev/null && echo "" && echo "=== CPU使用率 ===" && top -b -n 1 | head -10)
        echo "$RESULT" | dialog --programbox "CPU 温度・使用率" 45 90
        clear
        
                
d       SSDの温度計測
        RESULT=$(echo "=== 内蔵SSD (sda) ===" && sudo smartctl -a /dev/sda | grep -i -E "temp|model|serial|health" && echo "" && echo "=== 外付けSSD (sdb) ===" && sudo smartctl -a -d sat /dev/sdb | grep -i -E "temp|model|serial|health")
        echo "$RESULT" | dialog --programbox "SSD 温度計測" 20 110
        clear

b       Vaultwarden・PassManager Backup and Restore
        CHOICE=$(dialog --menu "バックアップメニュー" 15 50 4 \
            1 "今すぐバックアップ実行" \
            2 "バックアップ一覧確認" \
            3 "データ復旧" \
            4 "キャンセル" \
            3>&1 1>&2 2>&3)
        case $CHOICE in
            1)
                RESULT=$(/mnt/data/backup/scripts/daily_backup.sh 2>&1)
                if [ $? -eq 0 ]; then
                    dialog --msgbox "バックアップ完了しました" 6 40
                else
                    dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
                fi
                ;;
            2)
                RESULT=$(ls -lh /mnt/data/backup/*_backup_*.tar.gz 2>/dev/null)
                echo "$RESULT" | dialog --programbox "バックアップ一覧" 20 70
                ;;
            3)
                DATE=$(dialog --inputbox "復旧する日付を入力してください\n例:20260529" 8 50 3>&1 1>&2 2>&3)
                if [ -n "$DATE" ]; then
                    RESULT=$(/mnt/data/backup/scripts/restore.sh $DATE 2>&1)
                    if [ $? -eq 0 ]; then
                        dialog --msgbox "復旧が完了しました" 6 40
                    else
                        dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
                    fi
                fi
                ;;
        esac
        clear

S       シャットダウン・再起動
        CHOICE=$(dialog --menu "シャットダウン・再起動" 11 55 2 \
            s "シャットダウン" \
            r "再起動" \
            3>&1 1>&2 2>&3)
        case $CHOICE in
            s)
                dialog --yesno "ubuntu-sv をシャットダウンします\n録画中・HLS配信中でないか確認してください\n本当に実行しますか?" 9 55
                if [ $? -eq 0 ]; then
                    sudo shutdown -h now
                fi
                ;;
            r)
                dialog --yesno "ubuntu-sv を再起動します\n本当に実行しますか?" 7 50
                if [ $? -eq 0 ]; then
                    sudo reboot
                fi
                ;;
        esac
        clear

V       PV公開更新(取込+report+index)
        RESULT=$(bash /mnt/data/backup/scripts/pv_publish.sh 2>&1)
        dialog --title "PV公開更新 [$?]" --msgbox "$RESULT" 24 76

s       sitemap.xml 更新
        RESULT=$(/mnt/data/backup/scripts/generate_sitemap.sh 2>&1)
        echo "$RESULT" | dialog --programbox "sitemap.xml 更新" 8 50
        clear

記事一覧