如何使用 systemd 列出(并重试)失败的挂载

如何使用 systemd 列出(并重试)失败的挂载

我有一些挂载点由于缺少依赖项(底层文件系统尚未解密)而加载失败。Asystemctl status <mountpoint>显示以下内容:

root@mymachine:/sharedfolders# systemctl status /sharedfolders/Multimedia
● sharedfolders-Multimedia.mount - Mount shared folder Multimedia to /sharedfolders/Multimedia
   Loaded: loaded (/etc/systemd/system/sharedfolders-Multimedia.mount; enabled; vendor preset: enabled)
   Active: inactive (dead)
    Where: /sharedfolders/Multimedia
     What: /srv/dev-disk-by-label-data/Multimedia

Jul 09 19:13:58 mymachine systemd[1]: Dependency failed for Mount shared folder Multimedia to /sharedfolders/Multimedia.
Jul 09 19:13:58 mymachine systemd[1]: sharedfolders-Multimedia.mount: Job sharedfolders-Multimedia.mount/start failed with result 'dependency'

是否有一个systemctl命令可以列出这些失败的挂载尝试并最好全部重试?

我试过了systemctl --failed,但没有在列表中看到这些挂载。到目前为止,我发现的所有其他命令都需要我指定挂载点,而这正是我首先想从系统中知道的。

附加问题:是否有 systemd 方式可以自动触发这些重试?我的意思是依赖关系在挂载单元中有明确记录,并且(然后解密的)依赖关系的挂载也是通过 systemd 完成的,因此它可以知道重新尝试这些依赖的挂载。

答案1

我发现

systemctl list-units -t mount --all | grep inactive |grep loaded |grep sharedfolders |grep -o "/.*" | xargs systemctl start

到目前为止,这相当丑陋,仍然需要手动调用或添加到 cron。我希望有更好的解决方案。

我来解释一下这些命令:

  • -t mounts将 systemd 单元列表限制为挂载
  • --all也展示了失败的
  • grep inactive将列表缩小到仅包含失败的列表
  • grep loaded将列表限制为至少具有功能的单元(例如,不是“未找到”)
  • grep sharedfolders将列表限制为特定于我的用例的挂载点
  • grep -o "/.*"将输出缩短为仅显示挂载点的路径
  • xargs systemctl start将剩余项目作为参数发送给 systemctl start,后者会再次挂载它们

答案2

我修改了 Chaos_99 方法,使其也允许“失败”的 systemctl 条目(不仅是不活动的),因为如果已经尝试过,其状态不是不活动的而是失败的(例如,在以下之后发生:“systemctl restart storage-music.mount”)。

所以:

#List all failed mount attempts and retry them
tries=0
MAX_TRIES=10
while [[ $tries -lt $MAX_TRIES ]]; do

   NOTMOUNTED=`systemctl list-units -t mount --all | grep 'inactive\|failed' | grep loaded | grep storage |grep -o -w 'storage-.*.mount' | cut -d' ' -f1 | wc -l`
   if [ $NOTMOUNTED == 0 ] ; then
      echo "All shared folders perfectly mounted"
      break
   fi
   echo "Trying to mount shared folders again"

   systemctl list-units -t mount --all | grep 'failed\|inactive' |grep loaded | grep storage |grep -o -w  "storage-.*.mount" | cut -d' ' -f1 | xargs -r systemctl restart
   sleep 10
   tries=$((tries+1))
done

与上一个答案的区别:

  • while [[ $tries -lt $MAX_TRIES... 它会尝试 10 次,每次尝试之间等待 10 秒,一切正常后立即退出。
  • grep 'inactive\|failed' greps 不仅不活动,而且失败的共享
  • cut -d' ' -f1仅取第一个单词或条目
  • wc -l 计算有多少个条目,如果一切正常安装则返回 0

我希望它有帮助。

相关内容