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!"
Пакет dwarf-fortress
, предоставляемый Ubuntu, использует оболочку Python /usr/games/dwarf-fortress
. Эта оболочка создает вторичную иерархию data
в $XDG_DATA_HOME/.local/share/dwarf-fortress/run/.unionfs-fuse
, которая монтируется как unionfs(8)
вместе с некоторыми другими каталогами.
Это позволяет вам размещать свои моды в каталоге $XDG_DATA_HOME/.local/share/dwarf-fortress
, поэтому вам не нужно менять содержимое каталога /usr/share/games/dwarf-fortress
, и это здорово! Однако с unionfs
следует обращаться осторожно и правильно очищать его. Сценарий Python не смог этого сделать, когда вы использовали C -c , чтобы выйти из игры.
Таким образом, unionfs
, вероятно, все еще установлен, но в плохом состоянии.
Итак, прежде всего, убедитесь, что игра полностью закрыта:
killall -s KILL Dwarf_Fortress
Затем убедитесь, что ничего не осталось unionfs
Крепление пеленгатора:
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)
Как видите, в настоящее время в моей системе их два. Поскольку оба сломаны, давайте избавимся от них с помощьюfusermount -u
:
fusermount -u /tmp/dwarf-fortresswvlaptrarun
fusermount -u /tmp/dwarf-fortress4ylv2t19run
И последнее, но самое важное, удалите .unionfs-fuse
в $XDG_DATA_HOME/dwarf-fortress/run/
. У меня нет набора XDG_DATA_HOME
, поэтому я должен использовать $HOME
. Проверьте env
, прежде чем случайно удалить не тот каталог!
rm -r $HOME/.local/share/dwarf-fortress/run/.unionfs-fuse
Вот именно. Обратите внимание, что версия df_linux
от Bay 12 Games не сталкивается с этой проблемой, так как не использует ни 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
Затем я проверил скрипт в любом редакторе и нашел
def get_user_run_dir():
old_run_dir = xdg.BaseDirectory.save_data_path('dwarf-fortress')
new_run_dir = os.path.join(old_run_dir, 'run')
...
def run_df_in_unionfs(user_run_dir, data_dirs, args):
mnt_dirs = user_run_dir + "=rw:" + ':'.join(data_dirs)
with tempfile.TemporaryDirectory(suffix='run', prefix='dwarf-fortress') as tmp_dir:
cmd = ['unionfs', '-o', 'cow,relaxed_permissions', mnt_dirs, tmp_dir]
subprocess.run(cmd).check_returncode()
try:
run_df(tmp_dir, args)
finally:
subprocess.run(['fusermount', '-u', tmp_dir]).check_returncode()
, который показал, что по крайней мере что-то можно найти в xdg.BaseDirectory
, то есть $HOME/.local/share
(, если не указано иное ). В то же время fusermount -u
показывает, что после того, как мы вышли из Dwarf Fortress, ожидается отключение от маунта, а mount | grep unionfs
подтверждает наличие активных маунтов в /tmp
. Я избавился от всего каталога $XDG_DATA_HOME/dwarf-fortress
, и он снова заработал. С помощью strace -ff -e trace=execve dwarf-fortress
я смог подтвердить монтирование unionfs
и нашел каталог .unionfs-fuse
.
Однострочная команда здесь:
find /path/to/dir1 -type f ! -mmin -10 -exec mv {} /path/to/dir2 \;
Замените -10
на что хотите, правило:
+n for greater than n,
-n for less than n,
n for exactly n.
Есть много способов.
Использование поиска:
if find some_directory -mmin +10 | grep "^filename$" ; then
mv filename somewhere_else
fi
Другим способом было бы вычислить md5sum и сравнить это
touch.filename.md5
prev_md5=$(cat.filename.md5)
new_md5=$(md5sum filename)
if [ "$prev_md5" = "$new_md5" ] ; then
mv filename somewhere_else
fi
echo "$new_md5" >.filename.md5
и запускайте его каждые 10 минут.