メニューにダイアログを表示させる「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