在 Ubuntu 中调试 /etc/init.d 启动脚本

Posted

技术标签:

【中文标题】在 Ubuntu 中调试 /etc/init.d 启动脚本【英文标题】:debugging /etc/init.d startup scripts in Ubuntu 【发布时间】:2011-12-19 15:02:25 【问题描述】:

有自定义 dropr 消息队列轮询器,我正在尝试通过 ubuntu 中的 /etc/init.d 启动。 所有 3 个脚本都是超级简单的一行代码,并且可以通过命令行完美运行,但由于某种原因,只有一个脚本在服务器启动时真正运行。都有 775 次烫发,效果很好:

sudo /etc/init.d/app-poller.sh 

这是一个示例脚本(必须以 www-data 用户身份运行):

[/etc/init.d]$  cat /etc/init.d/app-poller.sh 
#!/bin/sh
su - www-data -c "bash -c '/path/to/dropr-server/daemons/app-poller.php'"

我已经通过以下方式多次删除/重新输入了 inittab 条目:

updates-rc.d -f app-poller.sh remove
updates-rc.d app-poller.sh defaults

rcconf 脚本还说一切正常。 我已按照此处的所有说明进行操作:http://jonathonhill.net/2009-04-23/auto-start-a-shell-script-on-ubuntu-server/ 此处和此处:http://stringofthoughts.wordpress.com/2009/04/16/adding-removing-shell-scripts-ubuntu-810/

我已经在所有常见的嫌疑人(/var/log/messages、/var/log/daemons 等)中寻找输出......仍然没有任何线索。

非常想至少对失败的原因有所了解。任何人都知道我可以参考哪些日志文件来查看出了什么问题以及为什么?

【问题讨论】:

我尝试过的另外两件事(没有运气):1)更改了每个脚本的顺序(尝试了每个脚本的默认 [97,98 或 99])2)尝试更改脚本外壳从 "bash -c '/path/to/..." 到 sh 的绝对路径:"/bin/sh -c '/path/to/..." 【参考方案1】:

尝试改变:

su - www-data -c "bash -c '/path/to/dropr-server/daemons/app-poller.php'"

到:

/bin/su - www-data -c "/bin/bash -c '/path/to/dropr-server/daemons/app-poller.php'"

【讨论】:

谢谢迈克。结果还是一样——只有我的第 97 级脚本开始了。 98 岁的那个仍然没有......从 sudo 运行它可以很好地使用“sudo nohup /etc/init.d/second-poller.php > /dev/null &” 除了建议在/var/log目录下使用grep搜索dropr之外,我不知道还能说什么。通过ls 确认您所期望的正确符号链接实际上是为/etc/rc?.d/ 目录中的S97S98S99 脚本(对于您的K 脚本也是如此)在/etc/rc?.d/ 目录中创建...? 【参考方案2】:

尝试在模拟启动环境时调用初始化脚本:

env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" /etc/init.d/your-daemon start 

如果您没有看到该命令的任何输出,请在脚本中添加一些调试输出。

【讨论】:

【参考方案3】:

使用 -x 在子 shell 中运行它。

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html

【讨论】:

【参考方案4】:

我发现在 /etc/init.d/scriptname 顶部附近添加以下内容就是我所需要的:

debug_me=true

if [[ $debug_me == true ]]; then

  # Close STDOUT
  exec 1<&-
  # Close STDERR
  exec 2<&-

  LOG_FILE=/home/myhome/scriptname.log

  # Open STDOUT as $LOG_FILE file for read and write.
  exec 1<>$LOG_FILE

  # Redirect STDERR to STDOUT
  exec 2>&1

  # Display shell commands with expanded args
  set -x

fi

【讨论】:

您在第 3 行对 debug_me 的引用之前缺少一个 $

以上是关于在 Ubuntu 中调试 /etc/init.d 启动脚本的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu 9.10上的nfs客户端,/ etc / init.d / nfs-common不存在

ubuntu14.04服务版/etc/init.d/smbd restart无效的解决方法

ubuntu如何开启ssh服务

CentOS中service命令与/etc/init.d的关系以及centos7的变化

Ubuntu 16.04安装vsftpd 并开启ftp服务

ubuntu环境搭建