You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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被终止。用信号捕获脚本检测时,未捕获到该信号,仅生成空文件。

尝试过的解决方案

  1. 尝试让backup.sh脱离父进程,以下方法均无效:
    nohup backup.sh &
    (backup.sh &)
    backup.sh &
    disown
    setsid backup.sh
    
  2. 捕获多种信号,但备份仅偶尔成功:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:05:03