SteamOS(Arch)中创建脱离父进程的备份脚本规避不可捕获信号
非Steam游戏云存档管理器在SteamOS下的信号处理问题
我正在为非Steam游戏开发自定义云存档管理器,核心是实现一个包装器:启动游戏前从云端加载存档,收到关闭信号时备份存档。
Windows(WSL)下的正常实现
在Windows系统借助WSL,以下代码可正常运行:
launch_wrapper_windows.sh
#!/bin/bash path="~/game_save_backups" handle_HUP() { /mnt/c/Windows/system32/cmd.exe backup.bat exit } trap 'handle_HUP' HUP /mnt/c/Windows/system32/cmd.exe auto_override_load_saves.bat $1 "$2" handle_HUP
使用方式(Launch_x_game.bat)
cd ../game_save_backups/ wsl -e bash -lic "launch_wrapper_windows.sh emulator_path 'game_path'"
SteamOS(基于Arch Linux)下的问题
相同逻辑在SteamOS中无法正常工作:点击Steam overlay的停止按钮后,脚本先收到INT信号,随后会收到一个无法捕获的信号,导致已启动的backup.sh被终止。用信号捕获脚本检测时,未捕获到该信号,仅生成空文件。
尝试过的解决方案
- 尝试让
backup.sh脱离父进程,以下方法均无效:nohup backup.sh & (backup.sh &) backup.sh & disown setsid backup.sh - 捕获多种信号,但备份仅偶尔成功:
trap 'handle_HUP' INT trap 'handle_HUP' HUP trap 'handle_HUP' TERM trap 'handle_HUP' QUIT trap 'handle_HUP' EXIT trap 'handle_HUP' ABRT trap 'handle_HUP' STOP
推测是模拟器向父进程发送了自定义信号,最优解决方向是:首次收到Steam的INT信号时,让backup.sh完全脱离父进程。
信号捕获检测脚本
用于生成捕获所有信号的脚本:
#!/bin/sh # 为每个可用信号生成捕获函数 /bin/kill -l | tr ' ' '\n' | while read signal; do cat <<END_OF_FUNCTION handle_$signal () { echo "Caught $signal" exit } trap 'handle_$signal' $signal END_OF_FUNCTION done >sigcatcher.sh echo 'echo "$$"; sleep 600' >>sigcatcher.sh
运行方式:sigcatcher.sh >sigcatcher.out
内容的提问来源于stack exchange,提问作者Tima_ben
相关产品推荐
相关产品推荐

