-1

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

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

rclone mount remoterep:/examplefolder ~/Documents/examplefolder

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

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

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

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

4

1 回答 1

2

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

首先,当您使用exec在 shell 中生成进程时,这意味着您想用您提到的程序替换现有的 shell 进程。当您在 SSH 会话中执行此操作时,您将替换 SSH 守护程序启动的 shell 进程(并且您打算用来登录)。然后 SSH 将等待该进程退出(直到卸载卷),这就是您看到挂起的原因。您需要跳过execshell 配置中的 ,这将在不替换 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 以进行交互使用而不是脚本使用时。如果是这样,您可以在设置时调用nohup条件,PS1如下所示:

if [ -n "$PS1" ]
then
    nohup ~/mount_examplefolder >/dev/null 2>&1 &
fi
于 2019-09-21T23:13:30.717 回答