我有一个在启动时运行的脚本,但是它给了我在日志文件中看到的错误。当我手动运行它时,它运行良好 - 可能环境已更改。
有没有办法在启动时运行这样的脚本而无需重新启动?
脚本位于/etc/init.d
带有符号链接的/etc/rc5.d/S97mounter.sh
.
答案1
你可以以 root 身份运行
env - scriptname
这将在运行脚本之前清除您的环境,但是,它也会保留您的shell
.要清除环境并将 shell 设置为sh
,请执行以下操作:
env -i /bin/sh -c scriptname
然后,这将使用运行脚本/bin/sh
。但是,这不会完全模拟启动环境,因为这不计入当时可能未运行的其他服务。
我发现了一个类似的模拟 crontab 环境的问题,并且发布了一个非常有用的解决方案嗯嗯。
使用它,您可以在脚本中运行它并重新启动主机,然后使用环境文件加载您的环境:
启动脚本的一部分:
env > /var/tmp/bootenv
然后在正常运行时设置相同的启动环境,执行以下操作:
env - `cat /var/tmp/bootenv` /bin/sh -c scriptname
答案2
当程序通过用户会话而不是启动脚本启动时,有些事情可能会有所不同:
- 程序继承了许多环境变量(包括
PATH
,,HOME
……)。 - 该程序继承了几个文件描述符,包括终端。
- 限制可能不同。
要在最小环境下运行程序并关闭标准文件描述符,您可以使用类似
env -i PATH=/bin:/usr/bin:/sbin:/usr/sbin myprogram </dev/null >/dev/null 2>/dev/null
检查init
系统上的手册页或其他文档,了解它定义了哪些环境变量。许多打算作为守护进程运行的程序只需要PATH
它就可以了。上面的值PATH
是 Debian 上 init 的默认值。