设为首页 收藏本站
查看: 1249|回复: 0

[经验分享] 关于自定义脚本rc.local里开机不启动的问题--以tomcat和perl相关的脚本为例

[复制链接]

尚未签到

发表于 2015-12-28 04:00:08 | 显示全部楼层 |阅读模式
  本文将自己遇到的一些自定义脚本加入开机启动项却不成功的问题加以说明,花费了我很长时间才得以解决,当然也多谢了自己朋友的帮忙,正是因为他们的提醒,最后才找到了解决的办法,谢谢他们!!!!
  系统是centos5.5
  应用:nginx+perl+fastcgi以及tomcat
  现有几个脚本需加入/etc/rc.local里让他们开机自己启动,如下:
  # vi /etc/rc.local
  /usr/local/nginx/sbin/start_perl_cgi.sh stop
  /usr/local/nginx/sbin/start_perl_cgi.sh start
  /usr/local/tomcat/bin/startup.sh
  
  最后查找资料说tomcat不启动是因为需要相关的环境变量,而且它需要的环境变量已经在/etc/profile里进行了设置:
   DSC0000.jpg
  
  但是死活不开机自动启动,只是找不到需要的jdk,如下设置即可:
  source /etc/profile
  /usr/local/tomcat/bin/startup.sh
  
  或者:
  export JAVA_HOME=/usr/local/jdk
  /usr/local/tomcat/bin/startup.sh
  这样tomcat就能开机自动启动了.
  最让人头疼的是:/usr/local/nginx/sbin/start_perl_cgi.sh start怎么弄都不成功,不开机启动,但是手动执行却总是能成功!
  脚本内容如下,其实这个脚本很简单,相信你应该没问题的,这个脚本网上很多:
  #vi /usr/local/nginx/sbin/start_perl_cgi.sh
  #!/bin/bash
  
  #set -x
  if [[ $# != 1 ]];then
  echo "usage $0 start|stop|restart"
  exit 1
  fi
  dir=/usr/local/nginx
  stop ()
  {
  
  if [ -e $dir/logs/perl-fcgi.pid ];then

  
  kill -USR1 `cat $dir/logs/perl-fcgi.pid` 2>&1> /dev/null

  
  rm -f $dir/logs/perl-fcgi.pid 2>&1> /dev/null

  
  fi

  
  if [ -e $dir/logs/perl-fcgi.sock ];then
  
  rm -f $dir/logs/perl-fcgi.sock 2>&1> /dev/null
  
  fi       ##红色部分网上的没有加if判断语句和-f选项,在这里我加了,首先对其进行判断一下,不然在没有该文件的情况下会有提示信息:
   DSC0001.jpg
  echo "stop perl-fcgi done"
  }
  start ()
  {
  rm -f $dir/now_start_perl_fcgi.sh 2>&1 >/dev/null
  chown nobody.nobody $dir/logs
  echo "$dir/perl-fcgi.pl -l $dir/logs/perl-fcgi.log -pid $dir/logs/perl-fcgi.pid -S $dir/logs/perl-fcgi.sock" >>$dir/now_start_perl_fcgi.sh
  chown nobody.nobody $dir/now_start_perl_fcgi.sh
  chmod u+x $dir/now_start_perl_fcgi.sh
  sudo -u nobody $dir/now_start_perl_fcgi.sh
  echo "start perl-fcgi done"
  }
  case $1 in
  stop)
  stop
  ;;
  start)
  start
  ;;
  restart)
  stop
  start
  ;;
  esac

  其实看完这个脚本是没有问题的!请注意里面蓝色部分注释了的内容(#set -x 这里我没有开启调试信息)
  于是上网查找资料,有的说是rc.local里面需要使用绝对路径,有的说是权限问题.但是经过排查都不是这样的问题.
  比如说不能调用有变量的路径即:$dir
  
  可以在rc.local里实验一下:
  #vi /etc/rc.local
  dir=/usr/local/nginx
  echo "hello,this is $dir" > /home/zhangzj/ceshi
  
  保存退出,查看: #cat /home/zhangzj/ceshi
  hello,this is /usr/local/nginx   #说明这样使用没有问题
  最后在一朋友的帮助下说开启调试信息即:将set -x 打开,进行如下操作:
  #vi /etc/rc.local

  /usr/local/nginx/sbin/start_perl_cgi.sh stop > /home/zhangzj/stop
  /usr/local/nginx/sbin/start_perl_cgi.sh start >/home/zhangzj/start
  保存,退出:执行source /etc/rc.local 让其生效,最好执行,查看有没有错误设置以免造成开机无法启动的内容.查看调试信息:
  #cat /home/zhangzj/stop
  #cat /home/zhangzj/start  
  看他们有什么问题,然后针对问题进行解决.但是我这样执行后我这里没有错误,于是我将机器重启,再次查看上面调试信息时,出现以下情况:
   DSC0002.jpg
  注意红色的部分: sudo: sorry, you must have a tty to run sudo
  !!!!意思是执行sudo 的shell默认需要tty(终端),而这里没有.在 /etc/rc.local 中的命令,是没有控制终端的。
  上网查找资料说,只需如下操作即可:
  注释掉 /etc/sudoers中 ‘Defaults requiretty ’.保存退出,机器重启,问题得以解决.

   DSC0003.jpg
  关于requiretty的解释如下:
  If set, sudo will only run when the user is logged in to a real tty. When this flag is set, sudo can only be run from a login session and not via other means such as cron(8) or cgi-bin scripts. This flag is off by default.

  1) Defaults  requiretty,修改为 #Defaults  requiretty,表示不需要控制终端。
  2) Defaults  requiretty,修改为 Defaults:nobody !requiretty,表示仅 nobody 用户不需要控制终端。
  3) 如果修改为 Defaults:%nobody !requiretty,表示仅 nobody 组不需要控制终端。
  
  Defaults后面如果有冒号,是对后面用户的默认,如果没有,则是对所有用户的默认。就像配置文件中自带的一行:
  Defaults    env_reset
  
  其实这是一个很简单的问题,但是我却花了很长时间才得以解决,就是因为当时没有想到开启调试信息,可见在一个脚本执行不成功时,开启调试信息:set -x 查看其执行过程是多么的重要,这样也便于我们查找问题的关键所在.当然当你头脑发昏时,也不妨问问你的朋友,他们的意见也许对你很重要!!!!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-157185-1-1.html 上篇帖子: [转]DZ通行证算法,perl版,php版 下篇帖子: Perl:perl编程要注意的问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表