3

我在未执行的 Ubuntu 系统上安装了关闭脚本。它是一个 Amazon EC2 实例。我不确定这与这个事实有关,只是想指出这一点。

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

这是我安装脚本的方式:

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

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吗?我错过了什么?

4

2 回答 2

1

不兼容 LSB 的初始化脚本仍应运行。我发现原因是s3cmd无法读取其配置文件。出于某种我不知道的原因,在运行级别更改(0)期间,当init执行初始化脚本时,显然root运行这些脚本的用户不算作“真实”用户,因此它没有“主”目录s3cmd尝试读取配置。

--config=...使用命令行参数显式指定配置文件的位置来s3cmd解决这个问题。

于 2013-07-11T11:47:40.947 回答
1

我不确定该脚本是否已经满足这些要求,但我要尝试的第一件事是检查该脚本是否是有效的 LSB 脚本,afaik 您的脚本需要适应 LSB 友好的结构。这意味着您需要:

  • 在第一个 ($1) 参数中包含“开始、停止、重新启动、强制重新加载和状态”,案例结构是个好主意
  • 为每种情况返回正确的退出代码
  • 以类似 lsb 的结构记录运行时 deps(您可以查看:http ://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/initscrcomconv.html )

包含用于日志记录和调试的 init.d 函数也是一个好主意,例如 log_success_msg 或 log_failure_msg ,因为您需要将其包含在您的脚本中:/lib/lsb/init 函数

无论如何,有很多关于 LSB 初始化脚本的文档。

我希望这会有所帮助。

问候。

于 2013-07-10T18:00:55.150 回答