80,1024以下端口,普通用户,自启动服务
chmod u+s httpd
chmod u+s command
================================================
http://www.linuxidc.com/Linux/2006-11/737.htm
Resin可以用于WEB和JSP应用,单独使用Resin做WEB服务的时候,即把Resin的端口设为80,按照惯例在/etc/rc.d/rc.local里配置自启动是有问题的,这种情况下要把Resin注册成Linux的服务启动;步骤如下:
将$RESIN_HOME/contrib/init.resin.in复制到/etc/rc.d/init.d/resin
修改resin中的一些设置:JAVA_HOME设为JDK的目录,RESIN_HOME为Resin安装目录, USER为启动Resin的用户
用/sbin/chkconfig resin on将RESIN服务在启动级别345设置成自启动
这样Resin就注册成为Linux的服务了,会随着服务器启动而自启动;
http://blog.itpub.net/26250550/viewspace-1300335
linux自定义开机启动服务和chkconfig使用方法
linux自定义开机启动服务和chkconfig使用方法
1. 服务概述
在linux操作系统下,经常需要创建一些服务,这些服务被做成shell脚本,这些服务需要在系统启动的时候自动启动,关闭的时候自动关闭。
将需要自动启动的脚本/etc/rc.d/init.d目录下,然后用命令chkconfig --add filename将自动注册开机启动和关机关闭。实质就是在rc0.d-rc6.d目录下生成一些文件连接,这些连接连接到/etc/rc.d /init.d目录下指定文件的shell脚本。
2. 手工创建服务
在/etc/rc.d/init.d目录下创建shell脚本,文件名auto_run。
设置脚本的运行权限chmod +x auto_run。
然后在rc0.d-rc6.d目录下分别创建文件连接。
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc2.d/S99auto_run
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc3.d/S99auto_run
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc5.d/S99auto_run
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc0.d/K01auto_run
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc6.d/K01auto_run
这样系统在启动的时候,就会运行auto_run 并加上start参数,等同于执行命令auto_run start。
在系统关闭的时候,就会运行auto_run,并加上stop参数,等同于运行命令auto_run stop。
创建连接的6条命令可以用命令chkconfig --add auto_run来完成,这样就简单多了,还不容易出错。
下面就介绍一下chkconfig命令。
3. chkconfig命令用法
语法:
chkconfig --list [name]
chkconfig --add name
chkconfig --del name
chkconfig [--level levels] name <on|off|reset>
chkconfig [--level levels] name
说明:
chkconfig提供一种简单的命令行工具来帮助管理员对/etc/rc[0-6].d目录层次下的众多的符号链接进行直接操作。
此命令使用是由chkconfig命令在IRIX操作系统提供授权。不用在/etc/rc[0-6].d目录下直接维护配置信息,而是直接在/etc/rc[0-6]下管理链接文件。在运行级别的目录下的配置信息通知在将会初始启动哪些服务。
Chkconfig有五个很明确的功能:为管理增加一个新的功能、删除一个功能、列出当前服务的启动信息、改变一个服务的启动信息和检测特殊服务的启动状态。
当chkconfig没有参数运行时,它将显示其使用方法。如果只给出了一个服务名,它将检测这个服务名是否已经被配置到了当前运行级别中。如果已经配置,返回真,否则返回假。--level选项可以被用做查询多个运行级别而不仅仅是一个。
如果在服务名之后指定了on,、off或reset,chkconfig将改变指定服务的启动信息。On或off标记服务被打开或停止,尤其是在运行级别被改变时。Reset标记重置服务的启动信息。
默认情况下,on或off选项仅对2、3、4、5有影响,而 reset影响所有的运行级。--level选项可以被用于指定哪个运行级别接收影响。
注意:对于每个服务,每一个运行级都有一个开始角本和一个结束角本。当开或关一个运行级时,init不会重新开始一个已经运行的服务,也不会重新停止一个未运行的服务。
选项:
--level levels
指定一个运行级别适合的操作。范围为0-7。
--add name
增加一个新的服务。
--del name
删除一个服务
--list name
显示服务的情况
RUNLEVEL FILES
每个通过chkconfig管理的服务在其init.d目录下的角本中都需要两行或多行的注释。第一行告诉chkconfig在默认情况下什么运行级别的服务可以开始,也就是所说的开始或结束的优先级别。如果服务没有默认的级别,建造将在所有运行级别中启动。a – 将用于代替运行级列表。第二个注释行包括对此服务的描述,可以通过反斜线符号扩展为多行。
示例,auto_run的前三行如下:
#!/bin/sh
#chkconfig: 2345 80 90
#description:auto_run
第一行,告诉系统使用的shell,所以的shell脚本都是这样。
第二行,chkconfig后面有三个参数2345,80和90告诉chkconfig程序,需要在rc2.d~rc5.d目录下,创建名字为 S80auto_run的文件连接,连接到/etc/rc.d/init.d目录下的的auto_run脚本。第一个字符是S,系统在启动的时候,运行脚本auto_run,就会添加一个start参数,告诉脚本,现在是启动模式。同时在rc0.d和rc6.d目录下,创建名字为K90auto_run的文件连接,第一个字符为K,系统在关闭系统的时候,会运行auto_run,添加一个stop,告诉脚本,现在是关闭模式。
注意上面的三行中,第二,第三行是必须的,否则在运行chkconfig --add auto_run时,会报错。
4. 常见的错误
“服务不支持 chkconfig”:
请注意检查脚本的前面,是否有完整的两行:
#chkconfig: 2345 80 90
#description:auto_run
在脚本前面这两行是不能少的,否则不能chkconfig命令会报错误。
如果运行chkconfig老是报错,如果脚本没有问题,我建议,直接在rc0.d~rc6.d下面创建到脚本的文件连接来解决,原理都是一样的。
linux自定义开机启动服务和chkconfig使用方法
linux自定义开机启动服务和chkconfig使用方法
1. 服务概述
在linux操作系统下,经常需要创建一些服务,这些服务被做成shell脚本,这些服务需要在系统启动的时候自动启动,关闭的时候自动关闭。
将需要自动启动的脚本/etc/rc.d/init.d目录下,然后用命令chkconfig --add filename将自动注册开机启动和关机关闭。实质就是在rc0.d-rc6.d目录下生成一些文件连接,这些连接连接到/etc/rc.d /init.d目录下指定文件的shell脚本。
2. 手工创建服务
在/etc/rc.d/init.d目录下创建shell脚本,文件名auto_run。
设置脚本的运行权限chmod +x auto_run。
然后在rc0.d-rc6.d目录下分别创建文件连接。
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc2.d/S99auto_run
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc3.d/S99auto_run
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc5.d/S99auto_run
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc0.d/K01auto_run
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc6.d/K01auto_run
这样系统在启动的时候,就会运行auto_run 并加上start参数,等同于执行命令auto_run start。
在系统关闭的时候,就会运行auto_run,并加上stop参数,等同于运行命令auto_run stop。
创建连接的6条命令可以用命令chkconfig --add auto_run来完成,这样就简单多了,还不容易出错。
下面就介绍一下chkconfig命令。
3. chkconfig命令用法
语法:
chkconfig --list [name]
chkconfig --add name
chkconfig --del name
chkconfig [--level levels] name <on|off|reset>
chkconfig [--level levels] name
说明:
chkconfig提供一种简单的命令行工具来帮助管理员对/etc/rc[0-6].d目录层次下的众多的符号链接进行直接操作。
此命令使用是由chkconfig命令在IRIX操作系统提供授权。不用在/etc/rc[0-6].d目录下直接维护配置信息,而是直接在/etc/rc[0-6]下管理链接文件。在运行级别的目录下的配置信息通知在将会初始启动哪些服务。
Chkconfig有五个很明确的功能:为管理增加一个新的功能、删除一个功能、列出当前服务的启动信息、改变一个服务的启动信息和检测特殊服务的启动状态。
当chkconfig没有参数运行时,它将显示其使用方法。如果只给出了一个服务名,它将检测这个服务名是否已经被配置到了当前运行级别中。如果已经配置,返回真,否则返回假。--level选项可以被用做查询多个运行级别而不仅仅是一个。
如果在服务名之后指定了on,、off或reset,chkconfig将改变指定服务的启动信息。On或off标记服务被打开或停止,尤其是在运行级别被改变时。Reset标记重置服务的启动信息。
默认情况下,on或off选项仅对2、3、4、5有影响,而 reset影响所有的运行级。--level选项可以被用于指定哪个运行级别接收影响。
注意:对于每个服务,每一个运行级都有一个开始角本和一个结束角本。当开或关一个运行级时,init不会重新开始一个已经运行的服务,也不会重新停止一个未运行的服务。
选项:
--level levels
指定一个运行级别适合的操作。范围为0-7。
--add name
增加一个新的服务。
--del name
删除一个服务
--list name
显示服务的情况
RUNLEVEL FILES
每个通过chkconfig管理的服务在其init.d目录下的角本中都需要两行或多行的注释。第一行告诉chkconfig在默认情况下什么运行级别的服务可以开始,也就是所说的开始或结束的优先级别。如果服务没有默认的级别,建造将在所有运行级别中启动。a – 将用于代替运行级列表。第二个注释行包括对此服务的描述,可以通过反斜线符号扩展为多行。
示例,auto_run的前三行如下:
#!/bin/sh
#chkconfig: 2345 80 90
#description:auto_run
第一行,告诉系统使用的shell,所以的shell脚本都是这样。
第二行,chkconfig后面有三个参数2345,80和90告诉chkconfig程序,需要在rc2.d~rc5.d目录下,创建名字为 S80auto_run的文件连接,连接到/etc/rc.d/init.d目录下的的auto_run脚本。第一个字符是S,系统在启动的时候,运行脚本auto_run,就会添加一个start参数,告诉脚本,现在是启动模式。同时在rc0.d和rc6.d目录下,创建名字为K90auto_run的文件连接,第一个字符为K,系统在关闭系统的时候,会运行auto_run,添加一个stop,告诉脚本,现在是关闭模式。
注意上面的三行中,第二,第三行是必须的,否则在运行chkconfig --add auto_run时,会报错。
4. 常见的错误
“服务不支持 chkconfig”:
请注意检查脚本的前面,是否有完整的两行:
#chkconfig: 2345 80 90
#description:auto_run
在脚本前面这两行是不能少的,否则不能chkconfig命令会报错误。
如果运行chkconfig老是报错,如果脚本没有问题,我建议,直接在rc0.d~rc6.d下面创建到脚本的文件连接来解决,原理都是一样的。
linux 自启动服务 默认是以root启动的, 但是我们很多服务都是以普通用户启动的, 如果以root启动 , 这样会到来一些权限问题,例如应用中保存的文件等等.
以普通用户启动的核心指令如下:
su - user -f /path/shell
demo:
/etc/rc.local
[wxianfeng@li390-146 ~]$ cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
/bin/sh /usr/local/system/www/shell/linode/init_by_root.sh >> /usr/local/system/logs/init.log 2>&1
su - wxianfeng -f /usr/local/system/www/shell/linode/init_by_wxianfeng.sh >> /usr/local/system/logs/init.log 2>&1
init_by_root.sh 脚本
#!/bin/bash
# nginx
/usr/local/system/nginx/sbin/nginx
# mysql
/etc/init.d/mysqld start
# svn
svnserve -d -r /usr/local/system/vcs
init_by_wxianfeng.sh 脚本
#!/bin/bash source /usr/local/rvm/environments/ruby-1.9.2-p180 cd /usr/local/system/www/project_manager thin start -e production -d -p 5000 source /usr/local/rvm/environments/ruby-1.8.7-p334 thin start -C /etc/thin/thin.yml
解决办法有两种:
1.使用非80端口启动程序,然后再用iptables做一个端口转发。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
用root用户直接去执行就可以了!
2.假设我们需要启动的程序是nginx,那么这么做也可以达到目的。
一开始我们查看nginx的权限描述:
-rwxr-xr-x 1 nginx dev 2408122 Sep 5 16:01 nginx
这个时候必然是无法正常启动的。
首先修改文件所属用户为root:
chown root nginx
然后再加上s权限:
chmod u+s nginx
再次查看权限描述的时候:
-rwsr-xr-x 1 root root 2408122 Sep 5 16:01 nginx
这样就能启动了。
检查:ps -ef
1、先创建一个普通用户;
useradd nginx-soft
2、要想使用普通用户运行nginx 必须要将端口80更改,大于1024,此处使用8000;
listen 8000;
index路径修改;
日志文件路径修改;
#端口可以使用sudo或者 nat 转换解决;
3、将/home/nginx-soft目录下的logs/conf/html/赋权给nginx-soft这一普通用户;
chown -R nginx-soft *
检查:drwxr-xr-x. 2 nginx-soft root 4096 Sep 11 13:23 conf
drwxr-xr-x. 2 nginx-soft root 4096 Sep 11 13:23 html
drwxr-xr-x. 2 nginx-soft root 4096 Sep 11 13:30 logs
4、使用root用户指定nginx的配置文件:
../nginx/sbin/nginx -s stop
../nginx/sbin/nginx -c /home/nginx-soft/conf/nginx.conf
5、切换至普通用户的宿主目录下;
将nginx主程序下的配置文件conf、html、logs文件拷贝到普通用户的加目录下;
cp -ap ../nginx1.6.2/conf/ .
cp -ap ../nginx1.6.2/html/ .
cp -ap ../nginx1.6.2/logs/ .
#此处注意html、logs、端口文件的配置
6、 切换到nginx-soft普通用户下启动nginx
ps -ef|grep nginx
#!/bin/bash
#edit by lanjp
# Source LSB function library.
if [ -r /lib/lsb/init-functions ]; then
. /lib/lsb/init-functions
else
exit 1
fi
#
CATALINA_BASE=$1
RUNPATH="/opt/web"
#
function stop() {
PIDS=`ps aux | grep java | grep $CATALINA_BASE | awk '{print $2}'`
if [ -z "$PIDS" ];then
echo "$CATALINA_BASE is stoped."
else
echo -en "Shutting down $CATALINA_BASE \t..."
#su -l tomcat -c $CATALINA_BASE/bin/shutdown.sh > /dev/null 2>&1
su - tomcat $RUNPATH/$CATALINA_BASE/bin/shutdown.sh >/dev/null 2>&1
sleep 2
PIDS=`ps aux | grep java | grep $CATALINA_BASE | awk '{print $2}'`
if [ -z "$PIDS" ];then
log_success_msg
#return 0
fi
echo -n "..."
sleep 2
PIDS=`ps aux | grep java | grep $CATALINA_BASE | awk '{print $2}'`
if [ -z "$PIDS" ];then
log_success_msg
echo
#return 0
fi
echo -n "....."
sleep 2
PIDS=`ps aux | grep java | grep $CATALINA_BASE | awk '{print $2}'`
if [ -z "$PIDS" ];then
log_success_msg
echo
#return 0
fi
echo -n "..."
kill -9 "$PIDS" 2>&1 >/dev/null
RETVAL=$?
[ $RETVAL -eq 0 ] && log_success_msg
[ $RETVAL -ne 0 ] && log_failure_msg
sleep 1
#exit $RETVAL
fi
}
function start () {
PIDS=`ps aux | grep java | grep $CATALINA_BASE | awk '{print $2}'`
if [ ! -z "$PIDS" ];then
echo "$CATALINA_BASE (pid $PIDS) is running"
else
su - tomcat $RUNPATH/$CATALINA_BASE/bin/startup.sh >/dev/null 2>&1
RETVAL=$?
if [ $RETVAL -eq 0 ];then
log_success_msg "Starting $CATALINA_BASE"
else
log_failure_msg "Starting $CATALINA_BASE"
fi
sleep 2
fi
}
function status () {
PIDS=`ps aux | grep java | grep $CATALINA_BASE | awk '{print $2}'`
[ "$PIDS" != "" ] && log_success_msg "`basename $CATALINA_BASE` (pid $PIDS) is running"
[ "$PIDS" == "" ] && log_success_msg "`basename $CATALINA_BASE` is stoped"
}
case $2 in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 CATALINA_BASE {start|stop|restart|status}"
echo "Example: sh $0 tomcat_apps status"
esac
测试环境:Fedora7,管理员:root,普通用户:test1
实现目标:在Linux启动时,自动运行位于普通用户test1根目录下的脚本程序test.py,该程序会在每次执行时自动向本地日志文件追加一条记录,源码如下:
<ccid_nobr>
<ccid_code>from datetime import datetime now=datetime.now() f=open('test.log','a') f.write('%s '%now) f.close() |
Linux在启动时,会自动执行/etc/rc.d目录下的初始化程序,因此我们可以把启动任务放到该目录下,有两种办法:
方案一:
1、因为其中的rc.local是在完成所有初始化之后执行,因此我们可以把启动脚本写到里面
2、用root账号登陆Linux,vi /etc/rc.d/rc.local编辑文件,在最后加入两行需要执行的脚本程序:
cd /home/test1 --该步不可少,否则会提示没有权限打开'test.log'文件
su test1 -c "python /home/test1/test.py" --把要执行的命令作为一个参数传递级su
方案二:
1、init.d目录下都为可执行程序,他们其实是服务脚本,按照一定格式编写,Linux 在启动时会自动执行,类似Windows下的服务
2、用root帐号登录,vi /etc/rc.d/init.d/mystart,追加如下内容:
<ccid_nobr>
<ccid_code>#!/bin/bash #chkconfig:2345 80 05 --指定在哪几个级别执行,0一般指关机, 6指的是重启,其他为正常启动。80为启动的优先级,05为关闭的优先机 #description:mystart service RETVAL=0 start(){ --启动服务的入口函数 echo -n "mystart serive ..." cd /home/test1 su test1 -c "python /home/test1/test.py" } stop(){ --关闭服务的入口函数 echo "mystart service is stoped..." } case $1 in --使用case,可以进行交互式操作 start) start ;; stop) stop ;; esac exit $RETVAL |
3、运行chmod +r /etc/rc.d/init.d/mystart,使之可直接执行
4、运行chkconfig --add mystart,把该服务添加到配置当中
5、运行chkconfig --list mystart,可以查看该服务进程的状态
总结:
两种方案的的核心都是切换用户到test1,然后执行命令启动Python程序,做成服务的好处是可以定义多个交互命令,比如:start,stop,restart,reset...,在服务运行的过程中还可以做相应操作。最开始的时候,我按照一般的思路写了如下脚本,却怎么也执行不了:
<ccid_nobr>
<ccid_code>su test1 --切换到test1用户 cd /home/test1 --切换到根目录 python test.py --执行python程序 exit --退出test1帐号 |
看起来好象一切都没错,但是发现只运行了第一行的命令,后面的都没有运行,直到退出test1用户后才发现好象执行完毕。分析原因,是因为Linux启动的时候是在root帐号下,执行su test1等于打开了一个新的shell脚本,因此下面的代码都在等着新的Shell脚本结束才能运行,就象在主程序里调用了一个子程序,而子程序是个死循环,一下出来来结果下面的要等死了。知道了发生的原因,那么解决的办法就相对简单了,就是在执行上述脚本程序时,不要离开本身的Shell。我们可以把执行命令做为su的一个参数传递进去,因为没有涉及到打开新的Shell,因此可以正常执行你期望的脚本程序,顺利实现开机自动启动指定的脚本程序。