在 fstab 之后运行脚本

cha*_*lie 5 fstab

在 Ubuntu Linux 16.04.3 中,如何在 fstab 之后运行依赖于首先安装的另一个硬盘驱动器的脚本?

我试过了:

  • 在 /etc/init.d 中创建服务脚本,但该脚本在 fstab 之前执行。
  • 添加到/etc/rc.local,但同样的问题。

Geo*_*sen 11

我相信您需要systemd在 Ubuntu 16.04 上使用较新的服务,而不是/etc/init.d. 在这里,您将创建一个服务文件以在local-fs.target.

让我向您展示如何做到这一点的示例。

  1. service/etc/systemd/system目录中创建所需的文件

  2. 该文件将如下所示:

    [Unit]
    Description=Script to run after fstab
    After=local-fs.target
    
    [Service]
    Type=simple        
    ExecStart=/bin/bash -c "/script/to/run.sh"
    
    
    [Install]
    WantedBy=multi-user.target 
    
    Run Code Online (Sandbox Code Playgroud)
  3. 当然,您将通过以下方式设置服务:

    sudo systemctl start <name_of_service>
    sudo systemctl enable <name_of_service>
    
    Run Code Online (Sandbox Code Playgroud)

这将是如何完成的,请我自己没有测试过,这里是文档链接,可以进一步帮助您。请查看可用于服务文件中各个字段的其他选项。

https://access.redhat.com/articles/754933

https://www.freedesktop.org/software/systemd/man/bootup.html

https://www.freedesktop.org/software/systemd/man/systemd.html#

注意:noautofstab 挂载选项在这里很重要,请参阅

 local-fs-pre.target
                |
                v
       (various mounts and   (various swap   (various cryptsetup
        fsck services...)     devices...)        devices...)       (various low-level   (various low-level
                |                  |                  |             services: udevd,     API VFS mounts:
                v                  v                  v             tmpfiles, random     mqueue, configfs,
         local-fs.target      swap.target     cryptsetup.target    seed, sysctl, ...)      debugfs, ...)
                |                  |                  |                    |                    |
                \__________________|_________________ | ___________________|____________________/
                                                     \|/
                                                      v
                                               sysinit.target
                                                      |
                 ____________________________________/|\________________________________________
                /                  |                  |                    |                    \
                |                  |                  |                    |                    |
                v                  v                  |                    v                    v
            (various           (various               |                (various          rescue.service

                |                  |                  |                                         v
                v                  v                  v                                 emergency.target
            display-        (various system    (various system
        manager.service         services           services)
                |             required for            |
                |            graphical UIs)           v
                |                  |           multi-user.target
                |                  |                  |
                \_________________ | _________________/
                                  \|/
                                   v
                         graphical.target
Run Code Online (Sandbox Code Playgroud)

看看上面你的目标图表会local-fs.targetsysinit.target不能完全确定,因为后者封面上的所有文件系统。因此,您可以决定脚本运行的阶段,以便为您提供所需的效果。

您还可以将特定挂载点设置为目标foobar.mount。使用 找到您的完整列表systemctl list-units --type=mount

  • 这对我来说开箱即用。顶部的“[Install]”部分应称为“[Unit]”,其中包含 [After= 规范](https://www.freedesktop.org/software/systemd/man/systemd.unit.html)。我还发现 `ExecStart` 中不需要 `/bin/bash -c` 部分。同样对于知识,`simple` 有效地在后台启动流程 (2认同)