我想向 Linux 服务器(Ubuntu 12.04)添加一些用于自定义管理工作的脚本。最终,这些脚本是来自至少一个守护进程的回调脚本(在我的例子中是 PostgreSQL,但这并不重要)。为了让守护进程找到我的脚本,我必须提供完整路径;我/opt/<package>/bin
按照FHS。
当我将该路径添加到 PATH 中时/etc/environment
,用户可以在不提供完整路径的情况下调用脚本,但守护程序不能;它只是说“未找到”。
所以我的问题基本上是双重的:
- 如何将守护进程的路径添加到 PATH?
- 无论如何,这是一个好主意吗?或者我应该总是使用完整路径名?
答案1
当我将该路径添加到 /etc/environment 中的 PATH 时,用户可以在不提供完整路径的情况下调用脚本,但守护程序不能;它只是说“未找到”。
根据这个来源,这是 IBM AIX 文档(我找不到其他任何内容),但一般来说可能是正确的:1
操作系统使用的第一个文件登录时是/etc/environment 文件。 /etc/environment 文件包含指定所有进程的基本环境的变量。
请注意,它是不是源自任何系统范围.profile
,因此这是硬编码的。但是,如果它“在登录时”应用,则它将不适用于由 init 启动并且从不登录的守护进程(尽管“对于所有进程”与此相矛盾,也许这只是一个糟糕的用词选择)。
根据这个超级用户问答,/etc/environment
是其一部分聚丙烯酰胺,它支持“登录时”前提,并且再次意味着它不会被 init 生成的守护进程使用。还有很多其他参考资料,但似乎没有实际的 PAM 文档。
我应该总是使用完整路径名吗?
这是最常见和普遍推荐的过程——守护进程可以在根本没有 $PATH 的情况下启动。因此,您可以在启动脚本中自行设置,或者如您所说,根据需要使用完整路径名。
答案2
这非常依赖于分布。 /etc/environment 属于 Linux 上的 PAM(正如已经指出的那样)。但是,/etc/environment 用于登录,而不是用于守护进程。对于服务和守护进程,通常有一些源自(通常是一些 rc 脚本)的配置脚本,例如,这些脚本可以在 Gentoo Linux 的 /etc/conf.d/ 中找到。但同样,这也非常依赖于发行版。用于启动服务的 Systemd 又是另一回事了。
最好用程序的绝对名称来调用程序 - 这也是安全最佳实践,因为它可以避免对要运行的程序产生任何歧义。