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

http://www.cnblogs.com/jimeper/archive/2013/03/12/2955687.html

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下面创建到脚本的文件连接来解决,原理都是一样的。

http://www.cnblogs.com/jimeper/archive/2013/03/12/2955687.html

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下面创建到脚本的文件连接来解决,原理都是一样的。

http://wxianfeng.com/2012/10/27/linux-init

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



http://www.fanli7.net/a/JAVAbiancheng/JAVAzonghe/20130220/267079.html
默认情况下Linux的1024以下端口是只有root用户才有权限占用,我们的tomcat,apache,nginx等等程序如果想要用普通用户来占用80端口的话就会抛出java.net.BindException: Permission denied:80的异常。 

解决办法有两种: 

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 

这样就能启动了。 
http://www.iyunv.com/thread-32593-1-1.html
一般情况下,我们在编译安装的时候会创建指定nginx来运行程序,但是nginx启动后它的master进程还是root,为了安全起见,我们要修改它的主进程,改为普通用户。     注意:普通进程就使用普通用户管理就可以,不要任何程序都使用root,一但出问题,很难搞!
     检查: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
 
 
http://bbs.linuxtone.org/thread-8148-1-1.html


#!/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
 
 
 
http://blog.csdn.net/shootyou/article/details/6750230
http://blog.sina.com.cn/s/blog_56d8ea90010104vz.html
http://blog.itpub.net/29500582/viewspace-1372034/
http://os.51cto.com/art/200805/75144.htm

测试环境: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,因此可以正常执行你期望的脚本程序,顺利实现开机自动启动指定的脚本程序。

 
 
 

 

posted @ 2015-01-05 16:59  陳聽溪  阅读(704)  评论(0编辑  收藏  举报