关于自定义脚本rc.local里开机不启动的问题--以tomcat和perl相关的脚本为例
本文将自己遇到的一些自定义脚本加入开机启动项却不成功的问题加以说明,花费了我很长时间才得以解决,当然也多谢了自己朋友的帮忙,正是因为他们的提醒,最后才找到了解决的办法,谢谢他们!!!!
系统是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.
1) Defaults 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相关的脚本为例的更多相关文章
- ArchLinux For Arm 树莓派开机自启动脚本rc.local
今天折腾了下树莓派的迅雷固件,迅雷的安装很顺利,解压直接运行portal 就搞定了, 但是自启动就有问题了,由于新版的ArchLinux切换到systemd,不但rc.conf省了,连rc.local ...
- 如何把rc.local里执行的shell脚本的日志内容放到其他位置
rc.local的日志内容默认是/var/log/boot.log /etc/rc.d/rc.local文件的文件头是#!/bin/sh ,我们把这修改成#!/bin/sh -x,这样系统启动后就会把 ...
- Ubuntu 18.04 设置开机启动脚本 rc.local systemd
ubuntu18.04不再使用initd管理系统,改用systemd. ubuntu-18.04不能像ubuntu14一样通过编辑rc.local来设置开机启动脚本,通过下列简单设置后,可以使rc.l ...
- Mac下用Launchd实现使用rc.local执行开机启动命令
其实原理很简单,使用Launchd创建一个开机启动的服务,然后这个服务关联/etc/rc.local文件,那么接下来操作rc.local就和Linux下一样的了. 当然,这种思路还可以直接使用在~/. ...
- 用rc.local工具开机自启动
对于一些程序来说,无法直接开机自启动.那么我们可以利用开机自启动来执行一些命令,达到开机自启动的效果!!! 下面用tomcat来举个例子 tomcat启动的命令一般是./startup.sh 那么我们 ...
- Linux(CentOS)启动时自动执行脚本(rc.local)
下面说说通过rc.local文件进行开机启动 1.首先创建一个启动脚本,这里以启动docker为例 创建 docker-startup.sh 脚本 #! /bin/bash /usr/bin/mk-d ...
- 通过/etc/rc.local实现开机自动拉起服务
添加服务到/etc/rc.local 如自动拉起apache服务: /etc/rc.local: #!/bin/sh # # This script will be executed *after* ...
- Ubuntu 18.04 启用 rc.local 设置开机启动
ubuntu18.04 不再使用initd管理系统,改用systemd. 然而systemd很难用,改变太大,跟之前的完全不同. 使用systemd设置开机启动为了像以前一样,在/etc/rc.loc ...
- CentOS中在/etc/rc.local添加开机自启动项启动失败
应项目要求需要在开机的时候启动自己的Agent程序,想当然的直接就往/etc/rc.local当中添加启动命令,结果重启之后发现什么都没有发生....一开始还以为是Python路径的问题,结果改成绝对 ...
随机推荐
- Jmeter常用脚本开发之JDBC请求
简单说明:JDBC请求就是使用Jmeter连接数据库,执行sql语句,并返回对应的响应结果 步骤: 1.引入使用的数据库的驱动jar包,使用不同的数据库,我们需要引入不同的jar包.本文使用的MySQ ...
- win10 x64中 windbg x64 安装配置符号库
根据系统安装好x64版本,我的系统是win10 x64 ; windbg下载地址 https://developer.microsoft.com/zh-cn/windows/hardware/down ...
- Vim完全教程
一.简介 世界上只有三种编辑器,EMACS.VIM和其它. 我们所处的时代是非常幸运的,有越来越多的编辑器,相对于古老的VIM和EMACS,它们被称为现代编辑器.我们来看看这两个古董有多大年纪了: ...
- iis日志分析软件及大文本切割软件下载
在网上找了好几个日志分析软件,觉得这个是最简单.实用的,至少对我来说. 但这个软件有个缺点,就是日志比较大时,分析详细的会溢出,需要用到文本切割工具. 软件下载: iis日志分析软件 大文本切割软件 ...
- 一个比较有意思的SDN网络技术相关blog/doc
http://feisky.xyz/sdn/linux/index.html 涵盖了目前主流的网络技术,所有比较有意思的内容全都覆盖了 SDN网络 目录 基本网络 TCP/IP标准模型 DHCP与DN ...
- Redhat Linux网卡配置与绑定
Redhat Linux的网络配置,基本上是通过修改几个配置文件来实现的,虽然也可以用ifconfig来设置IP,用route来配置默认网关,用hostname来配置主机名,但是重启后会丢失. 相关的 ...
- HDOJ2089 不要62
原题链接 数位\(DP\)入门题. 记录前一个枚举到的数位,在每次枚举的时候避开\(4\),如果前一个数位为\(6\),还要跳过\(2\). 然后套上记搜模板就好. #include<cstdi ...
- 原生和web交互jsbridge交互总结
技术点:jsbridge. 一: 参数及其意义(代码意义结合支付项目) 二:主动请求原生参数与方法(sendapi) 参数1 判断接口类型 参数2 传递给原生的数据 参数3 回调函数,response ...
- 在 Ubuntu 上使用微信客户端
原文地址: http://www.myzaker.com/article/5979115d1bc8e08c30000071/ 在这个快速信息交互时代,无论是工作还是生活,都需要频繁的网络社交,而在中国 ...
- 使用mysql proxy对数据库进行读写分离
服务器安排如下: 192.168.100.128 主 192.168.100.129 从 192.168.100.130 mysql-proxy 1.在100.130中下载安装mysql-proxy ...