40

我有一个 node.js 脚本,它需要在启动时启动在 www-data 用户下运行。在开发过程中,我总是以以下方式启动脚本:

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

我确切地看到了发生的事情,manager.js 现在工作得很好。搜索所以我发现我必须把它放在我的/etc/rc.local. 此外,我学会了将输出指向一个日志文件并将其附加2>&1到“将标准错误重定向到标准输出”,它应该是一个守护进程,所以最后一个字符是&.

最后,我的/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 不起作用。怎么了?

4

17 回答 17

73

在这个 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
于 2012-12-05T11:29:40.313 回答
12

在某些 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“真实”一个 in的符号链接/etc/rc.d可能会丢失,而没有意识到原始一个 in只是一个符号链接。rc.local/etc

于 2014-04-14T21:04:15.560 回答
5

我最终得到了upstart,效果很好。

于 2011-11-30T19:05:52.727 回答
5

在 Ubuntu 中,我注意到有 2 个文件。真正的一个是/etc/init.d/rc.local; 好像另一个/etc/rc.local是假的?

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

于 2012-12-02T22:34:06.040 回答
4

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

于 2011-10-16T14:08:52.057 回答
3

我遇到了同样的问题(在 CentOS 7 上),我通过向 /etc/local 授予执行权限来修复它:

chmod +x /etc/rc.local
于 2015-03-25T09:58:30.400 回答
2

如果你在云上使用 linux,那么通常你没有机会用手触摸真正的硬件。所以第一次开机是看不到配置界面的,当然也不能配置。因此,该firstboot服务将始终妨碍rc.local. 解决方案是通过执行以下操作禁用firstboot

sudo chkconfig firstboot off

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

于 2014-04-22T20:16:40.343 回答
1

我通过编辑/etc/rc.local然后发出以下 3 个命令使我的脚本工作。

sudo mv /filename /etc/init.d/
sudo chmod +x /etc/init.d/filename 
sudo update-rc.d filename defaults

现在脚本在启动时工作。

于 2013-04-25T06:07:04.053 回答
1

我正在使用 CentOS 7。

$ cd  /etc/profile.d

$ vim yourstuffs.sh

在 yourstuffs.sh 脚本中键入以下内容。

在此处输入您要执行的任何内容

export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH

保存并重新启动操作系统。

于 2015-05-29T03:09:22.007 回答
1

我过去使用过 rc.local。但我从经验中了解到,在系统启动时运行脚本最可靠的方法是在 crontab 中使用@reboot命令。例如:

@reboot path_to_the_start_up_script.sh
于 2018-02-12T23:59:36.997 回答
0

这很可能是由缺少或不完整的 PATH 环境变量引起的。

如果您提供可执行文件(su 和节点)的完整绝对路径,它将起作用。

于 2013-05-22T05:42:29.587 回答
0

我的理解是,如果您将脚本放置在某个 RUN 级别,您应该使用 ln -s 将脚本链接到您希望它工作的级别。

于 2016-05-16T18:09:51.187 回答
0

首先使用 sudo chmod 755 /path/of/the/file.sh 现在 使脚本可执行,在 rc.localsh /path/of/the/file.sh 中退出 0 之前在 rc.local 中添加脚本,接下来使 rc.local 可执行,使用 sudo chmod 755 /etc/rc.local 下一步初始化 rc.local 使用 sudo /etc/init.d/rc.local start 这将启动 rc.local 现在重新启动系统。完毕..

于 2018-08-21T11:02:38.540 回答
0

我发现因为我在我的 中使用了面向网络的命令rc.local,所以有时它会失败。我通过将其放在sleep 3脚本的顶部来解决此问题。我不知道为什么,但是当脚本运行时,网络接口似乎没有正确配置或其他东西,这只是为 DHCP 服务器或其他东西留出了一些时间。我不完全理解,但我想你可以试一试。

于 2019-05-16T09:56:02.910 回答
0

我遇到了完全相同的问题,脚本在本地运行良好,但是当我重新启动/开机时却没有。

我通过更改文件路径解决了这个问题。基本上需要在脚本中给出完整的路径。在本地运行时,可以访问文件,但在重新启动时运行时,将无法理解本地路径。

于 2021-04-05T07:14:18.170 回答
-1

1 不推荐使用root运行node app等应用。

好吧,您可以做到,但可能会捕获更多异常。

2 rc.local 通常以 root 用户身份运行。

因此,如果您的脚本应该作为另一个用户(例如 www U)运行,则应确保 PATH 和其他环境正常。

3 我找到了一种以用户身份运行服务的简单方法:

sudo -u www -i /the/path/of/your/script

请首选sudo手册~ -i [命令] -i(模拟初始登录)选项将目标用户的密码数据库条目指定的shell作为登录shell运行...

于 2014-07-29T08:57:07.717 回答
-3

rc.local仅在启动时运行。如果您重新启动并希望脚本执行,它需要进入rc.0以 K99 前缀开头的文件。

于 2013-08-22T21:15:50.493 回答