我在 Ubuntu 系统上安装了一个关机脚本,但该脚本并未执行。这是一个 Amazon EC2 实例。我不确定这是否与此有关,只是想指出这一点。
该脚本应该将一些日志文件推送到 Amazon S3 存储桶,因此必须在网络启动时执行。
以下是我安装脚本的方法:
/etc/init.d/push-apache-logs-to-s3.sh
1)使用所需的命令创建文件。
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
而不是bash
?sh
不支持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=...
解决这个问题。
感谢大家的帮助和意见!