当前位置: 首页>>技术教程>>正文


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

, ,

问题描述

在最近的ubuntus中(具体来说,最让我感兴趣的是12.04)/var/run是tmpfs,因此我假设每次重启都会启动它。

然而,我看到一些文件夹,如/var/run/mysqld和许多其他文件夹。如何在每次重启时创建这些文件夹?是否有一些模板文件夹复制到/var/run/(如果是,哪个脚本会这样做),或者每个文件夹mkdir分别编辑,或者是什么?

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

即使你的系统是如此,它也不是常规的12.04。

最佳解决办法

(感谢@Zulakis和an answer on Serverfault指出这个答案跟不上Ubuntu正在进行的开发。)

从upstart切换到systemd的基本原理?开始采用systemd,现在有一个集中的机制来创建临时文件和目录,例如这些。希望使用此方法的服务可以在其自己的启动脚本中删除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

d表示创建一个目录(如果该目录尚不存在),之后是路径,其余的是权限,用户和组。无论是否启动相应的服务,都将创建这些目录。

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


老PRE-SYSTEMD答案:

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

$ 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

我相信这是处理mysqld的那个:

[ -d /var/run/mysqld ] || install -m 755 -o mysql -g root -d /var/run/mysqld
/lib/init/apparmor-profile-load usr.sbin.mysqld

man install表示-d表单将“创建指定目录的所有组件”。

次佳解决办法

对于遇到此线程的任何人,因为您正在寻找一个解决方案,以便您可以如何配置应用程序,以便它在/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 

pre-start脚本部分完成了这一操作。

第三种解决办法

新的tmpfs-mounted /run文件夹允许udev,lvm和mdadm等程序将运行时数据从initrd保留到关闭状态。

/var是任何Linux /UNIX系统的标准目录 – 它代表”variable”,并且是许多日志,cahces,BUT还编程变量设置文件甚至一些系统配置数据库的地方。

/var中的大多数东西都应该被系统正确清除和调节。您的虚拟内存交换文件也存在于/var中,所以不要乱用它。 /var/run还拥有大量正在运行的进程daemans的状态和参数信息。

此目录包含描述系统自引导以来的系统信息数据。必须在引导过程开始时清除(删除或截断)此目录下的文件。程序可能包含/var/run的sub-directory;对于使用多个run-time文件的程序,我们鼓励这样做。

好吧,因为/var/run安装为tmpfs。这意味着当你的机器启动它时它完全是空的,这意味着要防止守护进程因为left-over PID-file而无法启动。

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

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

第四种办法

Yet, I see there some folders, like /var/run/mysqld and numerous others. How those folders created on each reboot ? Is there some template folder which copied to /var/run/ (and if so, which script does that), or each folder mkdired separately, or what ?

File Hierarchy Standard中所定义,/var/run/run用于存储易失性运行时数据。

在那里创建的所有文件夹和文件都由创建文件的相应程序管理。没有复制的模板文件夹这样的东西,每个程序都可以使用该文件夹来存储易失性信息。系统重新启动时,存储的数据会丢失。

使用/run文件夹的一个常见问题是存储运行守护程序的pid,这些标记文件包含进程的进程号。它们主要用于您可以在/etc/init.d/中找到的启动/停止脚本

我希望能让你清楚明白!

BR

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1823.html,未经允许,请勿转载。