近期,PS5发售两年多还没有本地保存存档功能,机器仍不支持存档导出,这引发了玩家热议,表示索尼在这方面有点儿让人失望。
有玩家表示,明明有PS3以及PS4珠玉在前,玩家可以使用U盘导出自己的游戏存档并本地备份,怎么到了PS5这里发售两年多了仍然没有相关功能?而且想要备份存档,就必须要购买PS Plus才能上传云存档备份,而Xbox以及Steam在云存档方面是免费的!
玩家表示,这到底是存储技术更新了?还是索尼想靠这个从订阅上牟利?亦或是想避免作弊所做的安全措施?只能说目的存疑,这是一种耻辱!
这些话引发了不少玩家的共鸣,不少人希望索尼把这个功能还回来让玩家能用USB来保存备份数据,也有的玩家表示悲观:“USB保存备份、动态主题...索尼正在一点一点地阉割功能”。
也有玩家提出了不同的意见,他们认为PS Plus服务很好用,随时网络上传也不用总存备份,但是索尼最好给没开会员服务的玩家一点儿免费空间,这样玩家的体验才会更好。
默认情况下,Bash仅在退出时更新其历史记录,并用新版本覆盖现有历史记录。这样做会导致您无法保留完整的历史记录日志,原因如下:
如果一个用户多次登录,则覆盖操作将确保只有最后一个退出的shell保存其历史记录。如果您的shell异常终止-例如由于网络问题、防火墙更改或被杀死-则不会写入任何历史记录。为解决第一个问题,我们设置shell选项histappend,它会使所有新的历史记录行添加到末尾,并确保多个登录不会互相覆盖历史记录。
要防止在Bash异常终止时丢失历史记录行,我们需要确保它们在每个命令之后被写入。我们可以使用shell内置命令history -a导致立即写入所有新的历史记录行,并且可以通过将其添加到PROMPT_COMMAND变量来自动执行此操作。这个变量包含一个在显示任何新提示之前执行的命令,因此在每个交互式命令执行后都会运行。
请注意,每个命令后运行'history -a'会产生两个副作用:
新登录将能够立即回滚到现有登录的历史记录。所以如果您希望在两个会话中运行相同的命令,请先运行该命令,然后再启动第二次登录,您将能够立即检索命令。更不好的是,同时进行的交互式shell(对于给定用户)的历史命令将相互交织在一起。因此,历史记录并不是一系列按顺序执行的命令列表。如果你将整个历史文件作为一个整体进行查看,寻找封装特定任务的部分而不是搜索单个命令,可能会感到困惑。如果一个账号同时被多人使用,这可能只是一个问题,而这种情况并不理想。要设置所有这些内容,请在自己的〜/.bashrc文件中使用以下内容:
HISTFILESIZE=400000000HISTSIZE=10000PROMPT_COMMAND="history -a"shopt -s histappend
在上述内容中,我们还增加了存储在内存中的历史记录的最大行数,并删除了对历史文件本身的任何限制。默认值为500行,如果你是一个活跃用户,这将导致你很快丢失行数。通过将HISTFILESIZE设置为一个较大的值, 我们可以确保文件足够大, 从而在实践中是无限大的 - 通过设置$HISTSIZE, 我们可以限制内存中保留的行数. 不幸的是, bash在读取完整的历史文件之前会将其内存拷贝截断到$HISTSIZE的长度, 因此如果你的历史文件变得非常大, bash的启动时间会变得非常烦人. 更糟糕的是, 加载一个大的历史文件然后通过$HISTSIZE来截断它, 会导致臃肿的资源使用; bash最终会比历史文件只包含$HISTSIZE行的情况下使用更多的内存. 因此如果你希望你的历史文件变得非常大, 例如超过20,000行, 你应该定期归档它. 请参阅下面的归档历史文件。
PROMPT_COMMAND可能已经在您的设置中使用,例如包含用于更新XTerm显示栏的控制代码以显示当前提示符。如果已经在使用中,您可以附加到它的方式是:PROMPT_COMMAND="${PROMPT_COMMAND:-:} ; history -a"
您还可以设置变量HISTIGNORE和HISTCONTROL来控制保存的内容,例如删除重复行 - 尽管这样做会阻止您查看给定命令被用户运行的次数以及准确的时间(如果还设置了HISTTIMEFORMAT)。
请注意,因为PROMPT_COMMAND在打印新提示符之前执行,如果您的Shell在执行此行时终止,您可能仍然会丢失最后一条命令行。例如,请考虑以下示例:this_cmd_is_never_written_to_history ; kill -9 $$
使用扩展属性即使您已经说服bash在不截断历史文件的情况下记录历史,它仍然很容易丢失。如果由于任何原因您以交互模式启动一个没有加载您的.bashrc文件的shell(例如通过--rcfile选项),bash将默认无差别地截断历史记录,这可能意味着除非您在接下来的几个部分中归档和备份文件,否则将丢失所有历史记录。
在Linux和一些其他操作系统上,可以通过在历史文件上设置"追加属性"来防止这种情况发生。随后,未带有O_APPEND标志的open(2)调用将失败,并且该文件无法被删除、移动、截断或以其他方式修改,只能在末尾追加数据(即使是root用户),直到取消"追加属性"。通常只有root用户才能设置或取消此属性。
# Linux example on btrfs - setting the append-only flag with chattr(1)ormaaj-laptop # chattr +a .bash_historyormaaj-laptop # lsattr -a .bash_history-----a---------- .bash_historyormaaj-laptop # rm .bash_historyrm: cannot remove '.bash_history': Operation not permittedormaaj-laptop # >.bash_historybash: .bash_history: Operation not permitted
确切的方法和支持的属性因操作系统和文件系统而异。详细信息请参阅维基百科的这篇文章。在(至少)一些类似BSD的系统和OS X中,相应的命令是chflags。附加模式功能被分为"用户"和"系统"版本,这样非root用户可以在自己的文件上使用它。Linux似乎没有相应的方式让非root用户设置/取消附加模式。
通过原子写入和锁文件来防止混乱的历史记录使用原子写入和锁文件的概念与并发文件访问和数据完整性相关。原子写入和锁文件是软件开发中常用的技术手段,用于确保文件修改以原子方式进行,避免多个进程或线程同时访问同一文件时的冲突。
原子写入是一种确保写操作要么完全完成(写入所有预定数据),要么根本不发生的方法,消除了部分写入或损坏数据的可能性。这可以通过使用专门设计用于原子文件更新的操作系统级函数来实现。
另一方面,锁文件是用于实现锁定机制的文件,允许进程或线程在执行关键操作时获得对共享资源(如文件)的独占访问权。通过在访问共享文件之前获取锁文件,进程可以防止其他进程同时修改该文件,从而避免冲突并保持数据一致性。
原子写入和锁文件共同帮助防止混乱的历史记录,通过确保文件修改以控制和同步的方式进行。原子写入消除了数据不完整或损坏的风险,而锁文件提供了排他性访问,避免了同时发生的冲突修改。
然而,值得注意的是,使用原子写入和锁文件的实现细节和最佳实践可能因编程语言、操作系统和应用程序的具体要求而有所不同。
压缩历史文件以上操作会导致历史文件中出现大量重复命令。每次追加历史都会使历史文件增长到shell加载的所有历史命令。
更重要的是,就历史记录而言,我们关心的主要是能够找到先前执行过的命令。下面的脚本将从历史文件中删除已存在的所有命令,同时保持命令的顺序不变,这样你最近执行的命令将保留在文件底部(即保留命令的最后一次出现,而不是第一次)。
awk 'NR==FNR && !/^#/{lines[$0]=FNR;next} lines[$0]==FNR' "$HISTFILE" "$HISTFILE" > "$HISTFILEpressed" &&mv "$HISTFILEpressed" "$HISTFILE"
几个月后,这将我的历史文件从761474行压缩到2349行。请注意,如果你已设置了HISTTIMEFORMAT,这不会保留时间戳。
归档历史文件一旦你启用了这些方法,你会发现你的bash历史变得更有价值,可以随时回忆起你执行过的任何命令。因此,你应该确保你的历史文件包含在你的定期备份中。
你可能还想启用定期归档你的历史文件,以防止每次新的bash shell加载整个历史记录进入内存。在 Solaris 10 上,历史文件大小为 10,000 条条目时,bash 使用约 5.5MB 的内存,并且没有明显的启动延迟(假设 $HOME 在本地磁盘上?-- GreyCat)。当历史记录大小为 100,000 条条目时,内存使用量增长到 10MB,启动时有明显的3-5秒延迟。建议定期归档以删除最旧的日志行,并避免浪费资源,特别是如果RAM很重要。(1.5个月后,我最大的 ~/.bash_history 文件大小为7500条目。)
最好通过一个可以归档文件的工具来完成这个操作。可以使用一个简单的脚本来实现:
#!/bin/bashumask 077max_lines=10000linecount=$(awk 'END { print NR }' ~/.bash_history)if ((linecount > max_lines)); then prune_lines=$((linecount - max_lines)) head -n "$prune_lines" ~/.bash_history >> ~/.bash_historyve && sed -e "1,${prune_lines}d" ~/.bash_history > ~/".bash_historyp$$" && mv ~/".bash_historyp$$" ~/.bash_historyfi
该脚本从历史文件的顶部删除足够数量的行,将其大小截断为X行,并将剩余部分追加到 ~/.bash_historyve。这模拟了HISTFILESIZE的修剪功能,但是存档了剩余部分而不是删除它 - 确保你始终可以通过搜索 ~/.bash_history* 查询你的过去历史。
可以从个人的crontab中每晚或每周运行这样的脚本来启用定期归档。请注意,该脚本不处理多个用户,并且只会对当前用户的历史进行归档 - 扩展为针对所有系统用户运行(作为root)需要读者自己完成。
按月归档# https://github/kaihendry/dotfilesmkdir -p ~/bash_historyshopt -s histappendHISTCONTROL=ignoredupsPROMPT_COMMAND=$'history -a; history -n;\n'$PROMPT_COMMAND# If your bash is older than 4.3, set these to a large number instead# else your history files will be emptyHISTFILESIZE=-1 HISTSIZE=-1HISTFILE=~/bash_history/$(date +%Y-%m)h() { grep "$@" ~/bash_history/*}
当日期在你的shell仍在运行时更改为新的月份时,会发生什么?那么HISTFILE将指向错误的位置。
将历史记录保存到数据库要避免丢失任何历史记录线,并将其保存到数据库中,可以采取以下几个步骤:
创建一个适当的数据库:选择一个可靠的数据库管理系统(如MySQL、SQLite或MongoDB)来存储历史记录数据。设计数据库结构:确定历史记录的结构和字段。根据需要,创建必要的表和关联关系。设置定期备份:创建一个定期自动备份数据库的计划,以确保数据的安全性和完整性。建议将备份文件存储在不同的位置,以防止单点故障。异常情况处理:制定有关异常情况处理的策略,例如停电或服务器故障。可以考虑使用冗余服务器或云服务提供商,以确保数据的持久性。数据库权限管理:限制对数据库的访问权限,并为不同级别的用户分配适当的权限。这可以帮助防止未授权的更改或意外删除历史记录数据。编写日志功能:实现对所有对数据库执行的操作进行详细记录的日志功能。这将有助于跟踪每个历史记录的修改和删除操作,并提供审计能力。监控和警报:设置对数据库性能和状态进行监控,并配置相应的警报机制。这样,如果发生异常情况或潜在威胁,您可以及时采取措施。请注意,确保您的数据库服务器和应用程序具有必要的安全性和权限控制,以防止未经授权的访问或恶意活动。
如果您觉得文章内容对你有一点帮助可以关注我,我在头条平台会持续分享更多实用的shell技巧和最佳实践,如果想系统的快速学习shell的各种高阶用法和生产环境避坑指南可以看看《shell脚本编程最佳实践》专栏,专栏里有更多的实用小技巧和脚本代码分享。
《怪物猎人:崛起》将于明年1月20日登陆PS和Xbox平台,有很多使用老款主机的玩家想知道,未来升级新款之后,是否支持存档互通。卡普空针对这个问题给出了答案。
对此,卡普空表示PS4和PS5版不支持存档互通,但使用Xbox One和XSX|S的玩家可以享受到此功能。PS4和PS5版玩家也是可以一起联机游玩的,Xbox版除了支持主机联机互通,主机也可以和PC Xbox玩家联机。
超大型DLC《怪物猎人崛起:曙光》将于2023年春季登场,敬请期待。