我有一些挂载点由于缺少依赖项(底层文件系统尚未解密)而加载失败。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
我希望它有帮助。