每次重新启动时如何在 /var/run 中创建文件夹

San*_*an4 75 filesystem boot

在最近的 ubuntus(特别是,我最感兴趣的是 12.04)/var/run是 tmpfs,因此我假设每次重新启动时它都是空的。

但是,我看到了一些文件夹,例如/var/run/mysqld和许多其他文件夹。每次重新启动时如何创建这些文件夹?是否有一些模板文件夹复制到/var/run/(如果是,哪个脚本执行该操作),或者每个文件夹分别被复制mkdir,或者什么?

编辑:
请不要回答/var/run是持久的,或者/run是持久的。因为它不是。

即使在您的系统上是这样,在常规 12.04 上也不是这样。

Pau*_*aul 104

(感谢@Zulakis 和关于 Serverfault 的回答指出这个回答没有跟上 Ubuntu 的持续发展。)

由于采用的systemd15.04,现在用于创建的临时文件和目录,如这些集中的机制。希望使用这种方法可以删除服务mkdir在其自己的启动脚本命令,而是把一个.conf文件中/etc/tmpfiles.d/run/tmpfiles.d或者/usr/lib/tmpfiles.d,与Ubuntu服务似乎更倾向于最后一个选项。例如,我的系统现在有:

$ egrep -r /var/run /usr/lib/tmpfiles.d

/usr/lib/tmpfiles.d/var.conf:L /var/run - - - - ../run
/usr/lib/tmpfiles.d/sudo.conf:d /var/run/sudo 0711 root root
/usr/lib/tmpfiles.d/sudo.conf:D /var/run/sudo/ts 0700 root root
/usr/lib/tmpfiles.d/postgresql.conf:d /var/run/postgresql 2775 postgres postgres - -
/usr/lib/tmpfiles.d/sshd.conf:d /var/run/sshd 0755 root root
/usr/lib/tmpfiles.d/screen-cleanup.conf:d /var/run/screen 0775 root utmp
Run Code Online (Sandbox Code Playgroud)

d如果目录不存在,则创建目录的方法,之后是路径,其余的是权限,用户和组。无论是否启动了相应的服务,都会创建这些目录。

有关完整文档,请参阅man tmpfiles.d


旧的预系统答案:

看起来它们是由单个服务在启动时动态创建的:

$ sudo egrep -r 'mkdir.*/var/run' /etc

/etc/init.d/ssh:        mkdir /var/run/sshd
/etc/init.d/bind9:      mkdir -p /var/run/named
/etc/init.d/timidity:    mkdir -p /var/run/timidity
/etc/init.d/bzflag:                mkdir -p /var/run/bzflag
/etc/init.d/dns-clean:mkdir /var/run/pppconfig >/dev/null 2>&1 || true
/etc/init/winbind.conf: mkdir -p /var/run/samba/winbindd_privileged
/etc/init/dbus.conf:    mkdir -p /var/run/dbus
/etc/init/ssh.conf:    mkdir -p -m0755 /var/run/sshd
/etc/init/libvirt-bin.conf:     mkdir -p /var/run/libvirt
/etc/init/cups.conf:    mkdir -p /var/run/cups/certs
Run Code Online (Sandbox Code Playgroud)

我相信这是处理 mysqld 的:

[ -d /var/run/mysqld ] || install -m 755 -o mysql -g root -d /var/run/mysqld
/lib/init/apparmor-profile-load usr.sbin.mysqld
Run Code Online (Sandbox Code Playgroud)

man install 说 -d 形式将“创建指定目录的所有组件”。


Mit*_*tch 5

新的 tmpfs 挂载/run文件夹允许 udev、lvm 和 mdadm 等程序将运行时数据从 initrd 保存到关闭。

/var 是任何 Linux/UNIX 系统的标准目录——它代表“变量”,是一个存放大量日志、缓存的地方,但也有程序变量设置文件,甚至一些系统配置数据库驻留。

大多数东西/var应该由系统正确清除和调节。您的虚拟内存交换文件也存在,/var所以不要弄乱它。/var/run还保存了大量正在运行的进程守护程序的状态和参数信息。

此目录包含描述系统自启动以来的系统信息数据。在启动过程开始时,必须清除(根据需要删除或截断)此目录下的文件。程序可能有一个子目录/var/run;对于使用多个运行时文件的程序,鼓励这样做。

好吧,因为/var/run是作为 tmpfs 安装的。这意味着当你的机器启动时它是完全空的,它是为了防止像守护进程这样的东西因为一个遗留的 PID 文件而无法启动。

启动脚本通常会在使用它们之前创建它们需要的目录。如果要存储 PID 文件,请/var/run直接将其放入或在创建 PID 文件之前创建一个目录。这不是存储需要在重新启动后保留在那里的数据的地方。

来源:路径名和 Linux 系统管理员指南


小智 5

对于遇到此线程的任何人,因为您正在寻找如何配置应用程序的解决方案,以便它在其中创建目录,/var/run以便它可以存储它的 sock 或 pid 文件或其他任何东西……这是一个示例。我遇到这个线程是因为我想将 MySQL sock 文件存储在/var/run/mysqld. 因此,在我遇到此线程后,我开始在/etc/init文件中查找示例。dbus 是一个不错的选择。而且,我想出了这个 mysql 启动配置:

start on runlevel [2345] 
stop on runlevel [!2345] 
expect daemon 

pre-start script 
    mkdir -p -m0755 /var/run/mysqld 
    chown mysql:mysql /var/run/mysqld 
end script 

exec /etc/init.d/mysql start 
pre-stop exec /etc/init.d/mysql stop 
Run Code Online (Sandbox Code Playgroud)

预启动脚本部分起到了作用。