问题描述
我有一个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