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


使用rc.local运行脚本:脚本可以工作,但不能在启动时运行

, , , ,

问题描述

我有一个node.js脚本需要在启动时启动并在www-data用户下运行。在开发过程中,我始终使用以下命

su www-data -c 'node /var/www/php-jobs/manager.js

我看到发生了什么,manager.js现在很棒。搜索我发现我必须把它放在我的/etc/rc.local中。另外,我学会了将输出指向一个日志文件,并将2>&1附加到“将stderr重定向到stdout”,它应该是一个守护进程,所以最后一个字符是&

最后,我的/etc/rc.local看起来像这样:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

su www-data -c 'node /var/www/php-jobs/manager.js >> /var/log/php-jobs.log 2>&1 &'

exit 0

如果我自己运行(sudo /etc/rc.local):是的,它有效!但是,如果我执行重新启动没有运行node进程,则/var/log/php-jobs.log不存在,因此manager.js不起作用。怎么了?

最佳解决办法

在这个rc.local脚本的例子中,我在第一行执行时使用io重定向到我自己的日志文件:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exec 2> /tmp/rc.local.log  # send stderr from rc.local to a log file
exec 1>&2                      # send stdout to the same log file
set -x                         # tell sh to display commands before execution

/opt/stuff/somefancy.error.script.sh

exit 0

次佳解决办法

在某些Linux(Centos& RH,例如)上,/etc/rc.local最初只是/etc/rc.d/rc.local的符号链接。在这些系统上,如果符号链接断开,并且/etc/rc.local是一个单独的文件,则在启动时将无法看到对/etc/rc.local的更改 – 启动过程将在/etc/rc.d中运行该版本。 (如果手动运行/etc/rc.local,它们将起作用,但不会在启动时运行。)

听起来像dimadima的系统,它们是单独的文件,但/etc/rc.d/rc.local调用/etc/rc.local

/etc/rc.local/etc/rc.d中的’real’的符号链接如果将rc.local移动到备份目录并将其复制回来或从头开始创建它就会丢失,而不是/etc中的原始版本只是一个符号链接。

第三种解决办法

我最终得到了upstart,它工作正常。

第四种办法

在Ubuntu中,我注意到有2个文件。真正的一个是/etc/init.d/rc.local;看来其他/etc/rc.local是假的吗?

一旦我修改了正确的(/etc/init.d/rc.local),它就会按预期执行。

第五种办法

您可能还通过指定节点的完整路径使其工作。此外,当您想要作为守护程序运行shell命令时,您应该通过在&前添加1<& – 来关闭stdin。

第六种办法

如果你在云上使用linux,那么通常你没有机会用你的手触摸真正的硬件。所以你第一次启动时看不到配置界面,当然也无法配置它。因此,firstboot服务将永远在rc.local的路上。解决方案是通过执行以下操作禁用firstboot

sudo chkconfig firstboot off

如果您不确定为什么rc.local没有运行,您可以随时从/etc/rc.d/rc文件中检查,因为该文件将始终运行并调用其他子系统(例如rc.local)。

第七种办法

我有同样的问题(在CentOS 7上),我通过给/etc /local赋予执行权限来修复它:

chmod +x /etc/rc.local

参考资料

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