【问题标题】:rclone mount volume automatically via bashrc on startuprclone 启动时通过 bashrc 自动挂载卷
【发布时间】:2019-09-21 21:35:55
【问题描述】:

我正在使用 rclone 从我的云存储中将一个文件夹挂载到我的本地计算机上。但是,在一台机器上,我只通过终端连接,我想在启动时安装卷。

所以我设置了一个包含以下内容的小 shell 脚本:

rclone mount remoterep:/examplefolder ~/Documents/examplefolder

我在 bashrc 中使用 exec ~/mount_examplefolder 调用它

当我 ssh 进入所述计算机时,它正在工作,因为我没有收到任何错误,但 shell 在执行 mount 命令时拒绝接受任何进一步的命令。

如果我添加另一个 ssh 登录,我会收到错误提示,因为它无法覆盖来自另一个会话的挂载文件夹。 那么我该如何解决这个问题,rclone 正在后台执行,让我可以访问 shell?

或者我是否仅限于手动安装它,然后使用另一个 ssh 会话来执行所需的操作?

【问题讨论】:

    标签: linux bash shell cloud rclone


    【解决方案1】:

    这里有几件事会导致一些问题。

    首先,当您使用exec 在shell 中生成一个进程时,这意味着您希望用您提到的程序替换现有的shell 进程。当您在 SSH 会话中执行此操作时,您将替换 SSH 守护程序启动的 shell 进程(并且您打算用来登录)。然后 SSH 将等待该进程退出(直到卸载卷),这就是您看到挂起的原因。您需要跳过 shell 配置中的 exec,这将在不替换 shell 的情况下生成进程。

    其次,您看到错误的原因是安装过程被设计为运行一次,正如您所注意到的。如果你想跳过已经挂载的文件夹,你可以使用类似下面的东西作为你的 shell 脚本:

    #!/bin/sh
    
    if ! grep " $HOME/Documents/examplefolder " /proc/mounts
    then
        rclone mount remoterep:/examplefolder ~/Documents/examplefolder
    fi
    

    请注意引号内的空格,以确保您没有意外匹配其他内容。这将确保您的脚本不会尝试多次挂载。

    第三,您可能希望在后台运行此命令并与 shell 分离,以便 shell 的退出不会导致它接收SIGHUP 并退出(或重新启动,具体取决于它的配置方式)。您可以通过在您的 shell 配置中将调用编写为 nohup ~/mount_examplefolder >/dev/null 2>&1 & 来完成此操作。 nohup 阻止程序接收 SIGHUP 并重定向输出阻止它打印消息或在各处创建 nohup.out 文件。

    最后,您可能(也可能不想)将其配置为仅在您使用交互式 shell 时运行;也就是说,当您登录以启动 shell 以进行交互使用而不是脚本使用时。如果是这样,您可以像这样设置PS1 时调用nohup 条件:

    if [ -n "$PS1" ]
    then
        nohup ~/mount_examplefolder >/dev/null 2>&1 &
    fi
    

    【讨论】:

    • 感谢您的建议,虽然使用 if 构造只能安装一次,但我专注于在安装时保持 shell 的空闲状态。我想从外壳中分离这个过程。现在我可以做一个并行登录......另外,如果我只是在 bashrc 中调用挂载 shellscript 而没有前面的 exec,shell 将保持空闲状态,我必须打开另一个
    • 对,你需要在后台使用nohup& 运行命令,这就是你如何安全地分离它并异步执行它。是的,如果您不想出现错误,可以只安装一次;卸载后,可以通过脚本再次安装。
    猜你喜欢
    • 2022-01-24
    • 2011-08-25
    • 2018-02-24
    • 2018-01-09
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多