【发布时间】:2014-08-20 01:10:11
【问题描述】:
我的程序需要运行其他程序。从正常终端会话运行时它工作正常。当使用 initscript 运行时,它不会获得正常的 shell 环境,并且大多数程序都会失败。那么我怎样才能让它与 initscript 一起工作呢?
vixie-cron 似乎使用 execle() 并将 envp 作为参数传递。但是我很难弄清楚它是如何获得 shell 环境设置的。
这是当前无法与 initscript 一起正常工作的代码:
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
} else if (pid == 0) {
execl("/bin/sh", "/bin/sh", "-c", cmd, (char *) NULL);
exit(EXIT_FAILURE);
}
编辑:发生了一些奇怪的事情。现在,即使由 init 脚本启动,相同的程序也可以正常运行。对不起,这是一个无用的问题。无论如何,我得到了很好的答案。谢谢你的帮助。
【问题讨论】:
-
究竟是什么不工作?有什么错误?为什么不报告代码中的错误?这似乎是一个人在面对意外行为时要做的第一件事......
-
(shell-)环境在很大程度上取决于运行进程的用户。你检查了吗?
-
获取环境变量的常用方法是调用getenv()。这可能是你看不到的。
-
Vixie-cron 从自动设置为用户名的
USER等内置变量获取环境变量,以及您放入crontab文件中的变量分配。您需要决定需要设置哪些变量,并将它们添加到您在execle中使用的环境数组中。 -
您可以在调用
execl之前使用putenv(),而不是使用execle()。