Mic*_*cha 4 configuration python linux-mint error-handling
事情是这样的。我正在运行 Mint 19,相对较新的安装。听说矮人要塞大肆宣传,安装了一次;然后,需要匆忙离开,用Control-C关闭它。从那以后,每次我尝试运行它时,我都会得到输出:
/tmp/dwarf-fortresss7j3cousrun/df: 6: /tmp/dwarf-fortresss7j3cousrun/df: ./libs/Dwarf_Fortress: not found
Traceback (most recent call last):
File "/usr/games/dwarf-fortress", line 93, in <module>
main()
File "/usr/games/dwarf-fortress", line 90, in main
run_df_in_unionfs_with_cleanup(user_run_dir, data_dirs, sys.argv)
File "/usr/games/dwarf-fortress", line 60, in run_df_in_unionfs_with_cleanup
run_df_in_unionfs(user_run_dir, data_dirs, args)
File "/usr/games/dwarf-fortress", line 54, in run_df_in_unionfs
run_df(tmp_dir, args)
File "/usr/games/dwarf-fortress", line 46, in run_df
subprocess.run(cmd).check_returncode()
File "/usr/lib/python3.6/subprocess.py", line 369, in check_returncode self.stderr)
subprocess.CalledProcessError: Command '['/tmp/dwarf-fortresss7j3cousrun/df', '/usr/games/dwarf-fortress']'
returned non-zero exit status 127.
Run Code Online (Sandbox Code Playgroud)
随后立即终止程序。我曾尝试移除,甚至清除并重新安装矮人要塞,但结果是一样的。它只运行了一次就完美无缺,尽管我一直盯着这个错误,但我无法理解它。
这不是关键业务或任何事情,从技术上讲,我什至不是玩家;但我真的很想知道为什么该程序现在失败了,以及我以何种方式破坏了它。如果不加以控制,那就太神秘了。谢谢你的时间。
TL;DR:使用下面的脚本来清理你的$XDG_DATA_HOME
/$HOME
从剩余的东西并卸载以前的unionfs
:
#!/bin/sh
set -eu
echo "Killing currently running Dwarf Fortress instances"
killall -q -9 Dwarf_Fortress || true
echo "Removing old Dwarf Fortress unionfs mounts and mount points"
find /tmp/ -maxdepth 1 -name "dwarf-fortress*" \
-printf " Found %f\n" \
\( -exec fusermount -u {} \; -o -true \) \
-exec rmdir {} \;
UNIONFSDIR="${XDG_DATA_HOME:-"${HOME:?}/.local/share/"}dwarf-fortress/run/.unionfs-fuse"
if [ -d "$UNIONFSDIR" ]; then
echo "Removing old .unionfs-fuse directory"
rm -r -- "$UNIONFSDIR"
fi
echo "Done. Run dwarf-fortress and praise Armok!"
Run Code Online (Sandbox Code Playgroud)
dwarf-fortress
Ubuntu 提供的包使用 Python 包装器/usr/games/dwarf-fortress
。该包装器在 中创建了一个二级data
层次结构$XDG_DATA_HOME/.local/share/dwarf-fortress/run/.unionfs-fuse
,它unionfs(8)
与其他一些目录一起安装。
这使您可以将 mod 放置在您的$XDG_DATA_HOME/.local/share/dwarf-fortress
目录中,因此您无需更改 的内容/usr/share/games/dwarf-fortress
,这很棒!但是,unionfs
必须小心处理并正确清理。当您习惯C-c退出游戏时,Python 脚本无法执行此操作。
因此,unionfs
是可能仍然安装,但在一个糟糕的状态。
所以首先,确保游戏完全关闭:
killall -s KILL Dwarf_Fortress
Run Code Online (Sandbox Code Playgroud)
然后确保没有剩余的unionfs
DF 安装:
mount | grep -a -e dwarf -e unionfs
unionfs on /tmp/dwarf-fortresswvlaptrarun type fuse.unionfs (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
unionfs on /tmp/dwarf-fortress4ylv2t19run type fuse.unionfs (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
Run Code Online (Sandbox Code Playgroud)
如您所见,我的系统上目前有两个。由于两者都坏了,让我们用fusermount -u
以下方法摆脱它们:
fusermount -u /tmp/dwarf-fortresswvlaptrarun
fusermount -u /tmp/dwarf-fortress4ylv2t19run
Run Code Online (Sandbox Code Playgroud)
最后,但最重要的是,删除.unionfs-fuse
in $XDG_DATA_HOME/dwarf-fortress/run/
。我没有XDG_DATA_HOME
设置,所以我必须使用$HOME
. env
在不小心删除错误的目录之前检查!
rm -r $HOME/.local/share/dwarf-fortress/run/.unionfs-fuse
Run Code Online (Sandbox Code Playgroud)
就是这样。请注意,Bay 12 Games的df_linux
版本不会遇到此问题,因为它既不使用 Python 包装器,也不使用 Unionfs。
话虽如此,该问题已于2019年修复并已发送至bullseye
. 不幸的是,它没有固定在 中0.44.12-1
,因此buster
可能仍会受到影响。
首先,我查看了file $(which dwarf-fortress)
,它告诉我这是一个 Python 脚本:
$ file $(which dwarf-fortress)
/usr/games/dwarf-fortress: Python script, ASCII text executable
Run Code Online (Sandbox Code Playgroud)
然后我用任何编辑器检查了脚本,发现
killall -s KILL Dwarf_Fortress
Run Code Online (Sandbox Code Playgroud)
这表明至少可以在 中找到一些东西xdg.BaseDirectory
,即$HOME/.local/share
(除非另有设置)。同时,fusermount -u
显示我们退出矮人要塞后有一个卸载挂起,并mount | grep unionfs
确认了活动坐骑/tmp
。我摆脱了整个$XDG_DATA_HOME/dwarf-fortress
目录,它又工作了。使用strace -ff -e trace=execve dwarf-fortress
,我能够确认unionfs
安装并找到.unionfs-fuse
目录。
归档时间: |
|
查看次数: |
907 次 |
最近记录: |