为什么关机脚本无法运行?

为什么关机脚本无法运行?

我在 Ubuntu 系统上安装了一个关机脚本,但该脚本并未执行。这是一个 Amazon EC2 实例。我不确定这是否与此有关,只是想指出这一点。

该脚本应该将一些日志文件推送到 Amazon S3 存储桶,因此必须在网络启动时执行。

以下是我安装脚本的方法:

/etc/init.d/push-apache-logs-to-s3.sh1)使用所需的命令创建文件。

2)使其可执行sudo chmod +x push-apache-logs-to-s3.sh

3)已执行sudo update-rc.d push-apache-logs-to-s3.sh start 0 0 .

上面的输出是:

update-rc.d: warning: /etc/init.d/push-apache-logs-to-s3.sh missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>
 Adding system startup for /etc/init.d/push-apache-logs-to-s3.sh ...
   /etc/rc0.d/S00push-apache-logs-to-s3.sh -> ../init.d/push-apache-logs-to-s3.sh

现在的内容/etc/rc0.d/是:

lrwxrwxrwx  1 root root   17 Jul 31  2012 K09apache2 -> ../init.d/apache2
lrwxrwxrwx  1 root root   29 Jun 16  2012 K10unattended-upgrades -> ../init.d/unattended-upgrades
lrwxrwxrwx  1 root root   26 Jun 16  2012 K15landscape-client -> ../init.d/landscape-client
lrwxrwxrwx  1 root root   19 Apr 10 11:11 K20memcached -> ../init.d/memcached
-rw-r--r--  1 root root  353 Jul 26  2012 README
lrwxrwxrwx  1 root root   35 Jul 10 12:01 S00push-apache-logs-to-s3.sh -> ../init.d/push-apache-logs-to-s3.sh
lrwxrwxrwx  1 root root   18 Jun 16  2012 S20sendsigs -> ../init.d/sendsigs
lrwxrwxrwx  1 root root   17 Jun 16  2012 S30urandom -> ../init.d/urandom
lrwxrwxrwx  1 root root   22 Jun 16  2012 S31umountnfs.sh -> ../init.d/umountnfs.sh
lrwxrwxrwx  1 root root   20 Jun 16  2012 S35networking -> ../init.d/networking
lrwxrwxrwx  1 root root   18 Jun 16  2012 S40umountfs -> ../init.d/umountfs
lrwxrwxrwx  1 root root   20 Jun 16  2012 S60umountroot -> ../init.d/umountroot
lrwxrwxrwx  1 root root   14 Jun 16  2012 S90halt -> ../init.d/halt

当我使用 手动执行脚本时sudo ./push-apache-logs-to-s3.sh,它会完成预期的工作。

这些脚本是由 执行的吗root?我遗漏了什么?

答案1

您希望脚本在关机时运行。将 start 替换为 stop,如下所示:

sudo update-rc.d push-apache-logs-to-s3.sh stop 0 0 .

请注意,它将以 K 开头,而不是以 S 开头

答案2

当您设置脚本在 时运行时,预期的行为是什么S00?我的系统上没有 脚本S00,是不是至少需要 1 个?您也没有明确设置启动/停止,也许这会导致问题。以防万一,请尝试

sudo update-rc.d push-apache-logs-to-s3.sh start 01 2 3 4 5 . stop 01 0 1 6 .  

如果仍然不起作用,请更新您的问题以了解您的脚本(或至少是它的标题),那里可能有问题。


编辑

看到你发布的脚本后其他问题,我发现两个可能的问题。首先,您的 shebang 行中有一个空格,!# /bin/sh而不是#!/bin/sh

更重要的是,为什么你要使用sh而不是bashsh不支持source,更不用说.将其作为源的别名了。 将您的脚本更改为使用 来运行bash,这应该可以解决问题。 事实上,我不明白为什么当你手动运行它时它会起作用,应该.会抛出一个错误:

$ sh
$ source foo
sh: 1: source: not found
$ bash
$ source foo
bash: foo: No such file or directory

划掉,我错了,正如@gnp指出的那样,dash确实支持.

答案3

问题的根源在于它s3cmd无法读取其配置文件。出于某些我不知道的原因,在运行级别更改 (0) 期间,当init执行 init-scripts 时,显然root运行这些脚本的用户不算作“真实”用户,因此它没有“主”目录来s3cmd尝试读取配置。

使用明确指定配置文件的位置可以--config=...解决这个问题。

感谢大家的帮助和意见!

相关内容