如何向守护进程的 PATH 添加新元素(或其他最佳实践)?

如何向守护进程的 PATH 添加新元素(或其他最佳实践)?

我想向 Linux 服务器(Ubuntu 12.04)添加一些用于自定义管理工作的脚本。最终,这些脚本是来自至少一个守护进程的回调脚本(在我的例子中是 PostgreSQL,但这并不重要)。为了让守护进程找到我的脚本,我必须提供完整路径;我/opt/<package>/bin按照FHS

当我将该路径添加到 PATH 中时/etc/environment,用户可以在不提供完整路径的情况下调用脚本,但守护程序不能;它只是说“未找到”。

所以我的问题基本上是双重的:

  1. 如何将守护进程的路径添加到 PATH?
  2. 无论如何,这是一个好主意吗?或者我应该总是使用完整路径名?

答案1

当我将该路径添加到 /etc/environment 中的 PATH 时,用户可以在不提供完整路径的情况下调用脚本,但守护程序不能;它只是说“未找到”。

根据这个来源,这是 IBM AIX 文档(我找不到其他任何内容),但一般来说可能是正确的:1

操作系统使用的第一个文件登录时是/etc/environment 文件。 /etc/environment 文件包含指定所有进程的基本环境的变量。

请注意,它是不是源自任何系统范围.profile,因此这是硬编码的。但是,如果它“在登录时”应用,则它将不适用于由 init 启动并且从不登录的守护进程(尽管“对于所有进程”与此相矛盾,也许这只是一个糟糕的用词选择)。

根据这个超级用户问答/etc/environment是其一部分聚丙烯酰胺,它支持“登录时”前提,并且再次意味着它不会被 init 生成的守护进程使用。还有很多其他参考资料,但似乎没有实际的 PAM 文档。

我应该总是使用完整路径名吗?

这是最常见和普遍推荐的过程——守护进程可以在根本没有 $PATH 的情况下启动。因此,您可以在启动脚本中自行设置,或者如您所说,根据需要使用完整路径名。

1. “/etc/environment”根本没有出现在相关的 POSIX 规范中[1] [2]

答案2

这非常依赖于分布。 /etc/environment 属于 Linux 上的 PAM(正如已经指出的那样)。但是,/etc/environment 用于登录,而不是用于守护进程。对于服务和守护进程,通常有一些源自(通常是一些 rc 脚本)的配置脚本,例如,这些脚本可以在 Gentoo Linux 的 /etc/conf.d/ 中找到。但同样,这也非常依赖于发行版。用于启动服务的 Systemd 又是另一回事了。

最好用程序的绝对名称来调用程序 - 这也是安全最佳实践,因为它可以避免对要运行的程序产生任何歧义。

相关内容