本文将自己遇到的一些自定义脚本加入开机启动项却不成功的问题加以说明,花费了我很长时间才得以解决,当然也多谢了自己朋友的帮忙,正是因为他们的提醒,最后才找到了解决的办法,谢谢他们!!!!

系统是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里进行了设置:

但是死活不开机自动启动,只是找不到需要的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选项,在这里我加了,首先对其进行判断一下,不然在没有该文件的情况下会有提示信息:

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

看他们有什么问题,然后针对问题进行解决.但是我这样执行后我这里没有错误,于是我将机器重启,再次查看上面调试信息时,出现以下情况:

注意红色的部分: sudo: sorry, you must have a tty to run sudo

!!!!意思是执行sudo 的shell默认需要tty(终端),而这里没有.在 /etc/rc.local 中的命令,是没有控制终端的。

上网查找资料说,只需如下操作即可:

注释掉 /etc/sudoers中 ‘Defaults requiretty ’.保存退出,机器重启,问题得以解决.

关于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.

1Defaults  requiretty,修改为 #Defaults  requiretty,表示不需要控制终端。

2) Defaults  requiretty,修改为 Defaults:nobody !requiretty,表示仅 nobody 用户不需要控制终端。

3如果修改为 Defaults:%nobody !requiretty,表示仅 nobody 组不需要控制终端。

Defaults后面如果有冒号,是对后面用户的默认,如果没有,则是对所有用户的默认。就像配置文件中自带的一行:

Defaults    env_reset

其实这是一个很简单的问题,但是我却花了很长时间才得以解决,就是因为当时没有想到开启调试信息,可见在一个脚本执行不成功时,开启调试信息:set -x 查看其执行过程是多么的重要,这样也便于我们查找问题的关键所在.当然当你头脑发昏时,也不妨问问你的朋友,他们的意见也许对你很重要!!!!

关于自定义脚本rc.local里开机不启动的问题--以tomcat和perl相关的脚本为例的更多相关文章

  1. ArchLinux For Arm 树莓派开机自启动脚本rc.local

    今天折腾了下树莓派的迅雷固件,迅雷的安装很顺利,解压直接运行portal 就搞定了, 但是自启动就有问题了,由于新版的ArchLinux切换到systemd,不但rc.conf省了,连rc.local ...

  2. 如何把rc.local里执行的shell脚本的日志内容放到其他位置

    rc.local的日志内容默认是/var/log/boot.log /etc/rc.d/rc.local文件的文件头是#!/bin/sh ,我们把这修改成#!/bin/sh -x,这样系统启动后就会把 ...

  3. Ubuntu 18.04 设置开机启动脚本 rc.local systemd

    ubuntu18.04不再使用initd管理系统,改用systemd. ubuntu-18.04不能像ubuntu14一样通过编辑rc.local来设置开机启动脚本,通过下列简单设置后,可以使rc.l ...

  4. Mac下用Launchd实现使用rc.local执行开机启动命令

    其实原理很简单,使用Launchd创建一个开机启动的服务,然后这个服务关联/etc/rc.local文件,那么接下来操作rc.local就和Linux下一样的了. 当然,这种思路还可以直接使用在~/. ...

  5. 用rc.local工具开机自启动

    对于一些程序来说,无法直接开机自启动.那么我们可以利用开机自启动来执行一些命令,达到开机自启动的效果!!! 下面用tomcat来举个例子 tomcat启动的命令一般是./startup.sh 那么我们 ...

  6. Linux(CentOS)启动时自动执行脚本(rc.local)

    下面说说通过rc.local文件进行开机启动 1.首先创建一个启动脚本,这里以启动docker为例 创建 docker-startup.sh 脚本 #! /bin/bash /usr/bin/mk-d ...

  7. 通过/etc/rc.local实现开机自动拉起服务

    添加服务到/etc/rc.local 如自动拉起apache服务: /etc/rc.local: #!/bin/sh # # This script will be executed *after* ...

  8. Ubuntu 18.04 启用 rc.local 设置开机启动

    ubuntu18.04 不再使用initd管理系统,改用systemd. 然而systemd很难用,改变太大,跟之前的完全不同. 使用systemd设置开机启动为了像以前一样,在/etc/rc.loc ...

  9. CentOS中在/etc/rc.local添加开机自启动项启动失败

    应项目要求需要在开机的时候启动自己的Agent程序,想当然的直接就往/etc/rc.local当中添加启动命令,结果重启之后发现什么都没有发生....一开始还以为是Python路径的问题,结果改成绝对 ...

随机推荐

  1. 编码补充 daty 6

    ---恢复内容开始--- 1.  用id求内存地址 id 查询内存地址 name = 'alex' print(id(name)) li = [1,2,3] print(id(li)) 结果: 2. ...

  2. 2D情况下,复数的意义代表旋转

    4 x i x i = - 4 就是"4"在数轴上旋转了180度. 那么4 x i = 4i 就旋转了90度. 复数的意义就表示旋转 乘以-1,表示x正半轴的数,围绕原点,逆时针偏 ...

  3. url中含有%

    Server.UrlEncode(“参数”)也可以使用javascript 的编码方式href="页面?name=encodeURI("参数")传送页代码编码 接收页代码 ...

  4. JAVA 8.20 游戏:四子连(Java&C++)

    (游戏:四子连 )四子连是一个两个人玩的棋盘游戏,在游戏中,玩家轮流将有颜色的棋子放在一个六行七列的垂直悬挂的网格中:         这个游戏的目的是在对手实现一行.一列或者一条对角线上有四个相同颜 ...

  5. iOS.KVC.setValue:forKey:

    Foundation Framework 定义了 NSObject(NSKeyValueCoding), - (void)setValue:(id)value forKey:(NSString *)k ...

  6. UI设计师经常去的五个网站

    1.站酷 站酷(ZCOOL),中国人气设计师互动平台.深耕设计领域十年,站酷聚集了470万优秀设计师.摄影师.插画师.艺术家.创意人,设计创意群体中具有较高的影响力与号召力.   2.花瓣 花瓣网, ...

  7. pycharm和anaconda

    借鉴其他博文和亲自操作做一简要的总结: anaconda是python中一个管理包很好用的工具,可以轻松实现python中的各种包的管理.相信大家会有这样的体验,在pycharm中也是有自动搜索和下载 ...

  8. Java 算法(一)贪心算法

    Java 算法(一)贪心算法 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 一.贪心算法 什么是贪心算法?是指在对问题进行求 ...

  9. xcode资源管理

    1. 在根目录放图片. UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ok.pn ...

  10. SpringMVC 学习 八 SSM环境搭建(一) web.xml配置

    第一步:导入jar包 注意包的兼容性,以后采用maven会好很多 第二步:配置web.xml 在web.xml中,主要的配置内容有以下几点 (1)spring容器配置文件的位置 <!-- spr ...