zoukankan      html  css  js  c++  java
  • Jsvc安装,配置 常规用户使用tomcat的80端口

     Jsvc安装

    一、下载安装包,地址如下:

    http://commons.apache.org/proper/commonsdaemon/download_daemon.cgi

    二、安装步骤,参考链接

    http://commons.apache.org/proper/commons-daemon/jsvc.html

      1. 解压文件commons-daemon-1.0.15-src.tar.gz,进入到目录commons-daemon-1.0.15-src/src/native/unix

     

     

      2.安装以下工具

     

      $sudo apt-get install autoconf

    如果GCC, Make, SDK等工具未安装,则一次安装。

      3. Buildingfrom source

    $ shsupport/buildconf.sh

     

      4. Buildingfrom a release tarball.

        $ export JAVA_HOME

        $ ./configure

        或者用以下命令代替以上两个命令(效果一样)

         $./configure --with-Java=/usr/java(这里是JAVA_HOME的路径)


    5.开始编译,成功后可在commons-daemon-1.0.15-src/src/native/unix目录下看到jsvc工具

    $ make

    6. 检查jsvc是否安装成功,出现相关的帮助信息则安装成功

      $./jsvc –help

    7、编译完成后出现jsvc文件夹,复制jsvc到/usr/lib/tomcat/apache-tomcat-xxxx/bin目录下面 

    [root@localhost ~]# cp jsvc /usr/lib/tomcat/apache-tomcat-xxxx/bin


    8、在/etc/init.d/(注意不是init文件夹)目录下编写tomcat6启动服务配置文件。 

    [root@localhost ~]#cd /etc/init.d/ 

    [root@localhost ~]# vi tomcat

    #!/bin/sh
    # chkconfig 2345 90 15
    # description Tomcat-en Manager
    # Licensed to the Apache Software Foundation (ASF) under one or more
    # contributor license agreements.  See the NOTICE file distributed with
    # this work for additional information regarding copyright ownership.
    # The ASF licenses this file to You under the Apache License, Version 2.0
    # (the "License"); you may not use this file except in compliance with
    # the License.  You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    #
    # -----------------------------------------------------------------------------
    # Commons Daemon wrapper script.
    #
    # $Id: daemon.sh 1202058 2011-11-15 06:37:12Z mturk $
    # -----------------------------------------------------------------------------
    #
    # resolve links - $0 may be a softlink
    JAVA_HOME=/usr/java/jdk1.7.0_79
    CATALINA_HOME=/opt/apache-tomcat-7.0.69
    DAEMON_HOME=$CATALINA_HOME/bin
    TOMCAT_USER=op
    CATALINA_BASE=$CATALINA_HOME
    CATALINA_OPTS="-server -XX:MaxPermSize=512m -XX:MaxNewSize=512m -Xmx2048m"
    proc="Tomcat 7.0.69" #注意这里的名字将会在启动或停止的时候显示(标识名称)
    ARG0="$0"
    while [ -h "$ARG0" ]; do
      ls=`ls -ld "$ARG0"`
      link=`expr "$ls" : '.*-> .∗$'`
      if expr "$link" : '/.*' > /dev/null; then
        ARG0="$link"
      else
        ARG0="`dirname $ARG0`/$link"
      fi
    done
    DIRNAME="`dirname $ARG0`"
    PROGRAM="`basename $ARG0`"
    while [ ".$1" != . ]
    do
      case "$1" in
        --java-home )
            JAVA_HOME="$2"
            shift; shift;
            continue
        ;;
        --catalina-home )
            CATALINA_HOME="$2"
            shift; shift;
            continue
        ;;
        --catalina-base )
            CATALINA_BASE="$2"
            shift; shift;
            continue
        ;;
        --catalina-pid )
            CATALINA_PID="$2"
            shift; shift;
            continue
        ;;
        --tomcat-user )
            TOMCAT_USER="$2"
            shift; shift;
            continue
        ;;
        * )
            break
        ;;
      esac
    done
    # OS specific support (must be 'true' or 'false').
    cygwin=false;
    darwin=false;
    case "`uname`" in
        CYGWIN*)
            cygwin=true
            ;;
        Darwin*)
            darwin=true
            ;;
    esac
    
    # Use the maximum available, or set MAX_FD != -1 to use that
    test ".$MAX_FD" = . && MAX_FD="maximum"
    # Setup parameters for running the jsvc
    #
    test ".$TOMCAT_USER" = . && TOMCAT_USER=tomcat
    # Set JAVA_HOME to working JDK or JRE
    # If not set we'll try to guess the JAVA_HOME
    # from java binary if on the PATH
    #
    if [ -z "$JAVA_HOME" ]; then
        JAVA_BIN="`which java 2>/dev/null || type java 2>&1`"
        test -x "$JAVA_BIN" && JAVA_HOME="`dirname $JAVA_BIN`"
        test ".$JAVA_HOME" != . && JAVA_HOME=`cd "$JAVA_HOME/.." >/dev/null; pwd`
    else
        JAVA_BIN="$JAVA_HOME/bin/java"
    fi
    
    # Only set CATALINA_HOME if not already set
    test ".$CATALINA_HOME" = . && CATALINA_HOME=`cd "$DIRNAME/.." >/dev/null; pwd`
    test ".$CATALINA_BASE" = . && CATALINA_BASE="$CATALINA_HOME"
    test ".$CATALINA_MAIN" = . && CATALINA_MAIN=org.apache.catalina.startup.Bootstrap
    test ".$JSVC" = . && JSVC="$CATALINA_BASE/bin/jsvc"
    
    # Ensure that any user defined CLASSPATH variables are not used on startup,
    # but allow them to be specified in setenv.sh, in rare case when it is needed.
    CLASSPATH=
    if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
      . "$CATALINA_BASE/bin/setenv.sh"
    elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
      . "$CATALINA_HOME/bin/setenv.sh"
    fi
    
    # Add on extra jar files to CLASSPATH
    test ".$CLASSPATH" != . && CLASSPATH="${CLASSPATH}:"
    CLASSPATH="$CLASSPATH$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/commons-daemon.jar"
    
    test ".$CATALINA_OUT" = . && CATALINA_OUT="$CATALINA_BASE/logs/catalina-daemon.out"
    test ".$CATALINA_TMP" = . && CATALINA_TMP="$CATALINA_BASE/temp"
    
    # Add tomcat-juli.jar to classpath
    # tomcat-juli.jar can be over-ridden per instance
    if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then
      CLASSPATH="$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar"
    else
      CLASSPATH="$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar"
    fi
    # Set juli LogManager config file if it is present and an override has not been issued
    if [ -z "$LOGGING_CONFIG" ]; then
      if [ -r "$CATALINA_BASE/conf/logging.properties" ]; then
        LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
      else
        # Bugzilla 45585
        LOGGING_CONFIG="-Dnop"
      fi
    fi
    
    test ".$LOGGING_MANAGER" = . && LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
    JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER"
    
    # Set -pidfile
    test ".$CATALINA_PID" = . && CATALINA_PID="$CATALINA_BASE/logs/catalina-daemon.pid"
    
    # Increase the maximum file descriptors if we can
    if [ "$cygwin" = "false" ]; then
        MAX_FD_LIMIT=`ulimit -H -n`
        if [ "$?" -eq 0 ]; then
            # Darwin does not allow RLIMIT_INFINITY on file soft limit
            if [ "$darwin" = "true" -a "$MAX_FD_LIMIT" = "unlimited" ]; then
                MAX_FD_LIMIT=`/usr/sbin/sysctl -n kern.maxfilesperproc`
            fi
            test ".$MAX_FD" = ".maximum" && MAX_FD="$MAX_FD_LIMIT"
            ulimit -n $MAX_FD
            if [ "$?" -ne 0 ]; then
                echo "$PROGRAM: Could not set maximum file descriptor limit: $MAX_FD"
            fi
        else
            echo "$PROGRAM: Could not query system maximum file descriptor limit: $MAX_FD_LIMIT"
        fi
    fi
    
    # ----- Execute The Requested Command -----------------------------------------
    case "$1" in
        run     )
          shift
          "$JSVC" $* 
          -java-home "$JAVA_HOME" 
          -pidfile "$CATALINA_PID" 
          -wait 10 
          -nodetach 
          -outfile "&1" 
          -errfile "&2" 
          -classpath "$CLASSPATH" 
          "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS 
          -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" 
          -Dcatalina.base="$CATALINA_BASE" 
          -Dcatalina.home="$CATALINA_HOME" 
          -Djava.io.tmpdir="$CATALINA_TMP" 
          -Dfile.encoding="UTF-8" 
          $CATALINA_MAIN
          echo -n "start $proc success."
          exit $?
        ;;
        start   )
          "$JSVC" 
          -java-home "$JAVA_HOME" 
          -user $TOMCAT_USER 
          -pidfile "$CATALINA_PID" 
          -wait 10 
          -outfile "$CATALINA_OUT" 
          -errfile "&1" 
          -classpath "$CLASSPATH" 
          "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS 
          -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" 
          -Dcatalina.base="$CATALINA_BASE" 
          -Dcatalina.home="$CATALINA_HOME" 
          -Djava.io.tmpdir="$CATALINA_TMP" 
          -Dfile.encoding="UTF-8" 
          $CATALINA_MAIN
          echo -n "start $proc success."
          exit $?
        ;;
        stop    )
          "$JSVC" $JSVC_OPTS 
          -stop 
          -pidfile "$CATALINA_PID" 
          -classpath "$CLASSPATH" 
          -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" 
          -Dcatalina.base="$CATALINA_BASE" 
          -Dcatalina.home="$CATALINA_HOME" 
          -Djava.io.tmpdir="$CATALINA_TMP" 
          $CATALINA_MAIN
          echo -n "Stop $proc success."
          exit $?
        ;;
        version  )
          "$JSVC" 
          -java-home "$JAVA_HOME" 
          -pidfile "$CATALINA_PID" 
          -classpath "$CLASSPATH" 
          -errfile "&2" 
          -version 
          -check 
          $CATALINA_MAIN
          if [ "$?" = 0 ]; then
            "$JAVA_BIN" 
            -classpath "$CATALINA_HOME/lib/catalina.jar" 
            org.apache.catalina.util.ServerInfo
          fi
          exit $?
        ;;
        *       )
          echo "Unknown command: \`$1'"
          echo "Usage: $PROGRAM ( commands ... )"
          echo "commands:"
          echo "  run               Start Tomcat without detaching from console"
          echo "  start             Start Tomcat"
          echo "  stop              Stop Tomcat"
          echo "  version           What version of commons daemon and Tomcat"
          echo "                    are you running?"
          exit 1
        ;;
    esac

    8、录入完成,按Esc键。输入: wq(vi下输入:x)保存退出并赋予/etc/init.d/tomcat文件可执行权限 

    [root@localhost~]# chmod +x /etc/init.d/tomcat

    ------------------添加服务----------------------------------------- 

    9、[root@localhost~] #chkconfig --add tomcat       ##添加tomcat服务 

    若提示chkconfig命令未找到,则需要执行sudo apt-get install chkconfig

    参考网址:http://blog.sina.com.cn/s/blog_66fb0c830100xm5y.html

    PS:chkconfig是redhat公司遵循gpl规则所开发的程序在ubuntu上默认是不支持chkconfig命令的,但可以自己安装。Ubuntu下是使用sysv-rc-conf来代替chkconfig。

    sudo apt-get install sysv-rc-conf

    安装完成后,直接运行sudo sysv-rc-conf命令即可打开该管理软件,如下图所示:

     

    操作界面十分简洁,你可以用鼠标点击,也可以用键盘方向键定位,用空格键选择, “X”表示开启该服务。 用Ctrl+N翻下一页,用Ctrl+P翻上一页,用Q退出。

    Ubuntu 的系统运行级别:

    0 系统停机状态

    1 单用户或系统维护状态

    2~5 多用户状态

    6 重新启动

    Ubuntu下可以直接加入启动程序,例如把 /etc/init/tomcat 加入到系统自动 启动列表中:

    #sudo sysv-rc-conf tomcat on

    想关闭tomcat的开机自动启动,只需#sudo mv /etc/init.d/tomcat(注意将配置脚本备份,否则删除后就跪了。)就可以了。

    参考网址:http://www.linuxidc.com/Linux/2012-10/73123p2.htm

    10、[root@localhost~] #chkconfig –list |grep tomcat    ##查看tomcat服务是否被添加 

    --------------------启动服务--------------------------------------------- 

    11、[root@localhost~] # service tomcat  start            ##启动tomcat服务 

    执行以上命令后,出现如下错误提示:

     

    按照网上的说法,添加软连接ln -s /lib/lsb/init-functions /etc/rc.d/init.d/functions,继续提示错误,原因很明显:软连接的文件夹压根就不存在!

    继续搜索,发现以下说法:

    在Linux中,/etc/init.d 和 /etc/rc.d/init.d这两个目录,都是用来放服务脚本的,当Linux启动时,会寻找这些目录中的服务脚本,并根据脚本的run level确定不同的启动级别。

    在制作服务脚本的过程中,使用了Linux的两个版本,CentOS和Ubuntu,需要在两个版本中都可以开机启动服务。但Ubuntu没有 /etc/rc.d/init.d这个目录,所以,为了保持同一种服务在CentOS和Ubuntu使用的统一性,将服务脚本(注:服务脚本在两个不同版本中是不同的)都放在 /etc/init.d 目录下,最终达到的效果是相同的。

    需要说明的是:在CentOS和Ubuntu两个版本中,除了服务脚本放置的目录是相同的,服务脚本的编写及服务配置都是不同的。比如CentOS使用Chkconfig进行配置,而Ubuntu使用sysv-rc-conf进行配置。

    查看/etc/rc2.d/里面的apache和MySQL启动脚本,通常都是两个阿拉伯数字后再接一个英文字母,再加脚本名称,例如S20tomcat。英文字母是S的都是会自动启动的,K则相反。所以只要找到apache和mysql的启动脚本,把S改成K就可以了。

    以下命令实现开机启动或不启动某服务(真的太像chkconfig了)

    sudo sysv-rc-conf 服务名 on(off)

    12、[root@localhost~] # sudo sysv-rc-conf  off            ##停止tomcat服务 

    13、[root@localhost~] #sudo sysv-rc-conf --list tomcat  ##查看tomcat服务启动状态 

    命令执行效果如下:

     

    Linux 系统主要启动步骤:

    1. 读取MBR 的信息,启动Boot Manager Windows使用NTLDR作为Boot Manager,如果您的系统中安装多个版本的 Windows,您就需要在NTLDR 中选择您要进入的系统。Linux 通常使用功能强大,配置灵活的GRUB作为Boot Manager。

    2. 加载系统内核,启动init 进程.init 进程是Linux 的根进程,所有的系统进程都是它的子进程。

    3. init 进程读取 /etc/inittab 文件中的信息,并进入预设的运行级别,按顺序运行该运行级别对应文件夹下的脚本。脚本通常以 start 参数启动,并指向一个系统中的程序。

    通常情况下, /etc/rcS.d/ 目录下的启动脚本首先被执行,然后是/etc/rcN.d/ 目录。例如您设定的运行级别为3,那么它对应的启动目录为/etc/rc3.d/ 。

    4. 根据 /etc/rcS.d/ 文件夹中对应的脚本启动Xwindow 服务器xorgXwindow 为Linux 下的图形用户界面系统。

    5. 启动登录管理器,等待用户登录Ubuntu 系统默认使用GDM 作为登录管理器,您在登录管理器界面中输入用户名和密码后,便可以登录系统。(您可以在 /etc/rc3.d/文件夹中找到一个名为S13gdm 的链接)

      2.编写服务启动类   

      package com.sohu.jsvc.test;

      public class TestJsvc {

      public static void main(String args[]) {

      System.out.println("execute main method!");

      }

      public void init() throws Exception {

      System.out.println("execute init method!");

      }

      public void init(String[] args) throws Exception{

      System.out.println("execute init(args) method");

      }

      public void start() throws Exception {

      System.out.println("execute start method!");

      }

      public void stop() throws Exception {

      System.out.println("execute stop method!");

      }

      public void destroy() throws Exception{

      System.out.println("execute destroy method!");

      }

      }

      main方法可以去掉,但是init(String[] args),start(),stop(),destroy()方法不能少,服务在启动时会先调用init(String[] args)方法,然后调用start()方法,在服务停止时会首先调用stop()方法,然后调用destroy() 方法. 

      3.把这个类打包成webservice_engine.jar放到/usr/lib目录下  

      4.编写启动服务的脚本 webservice_engineJSVC

      #!/bin/sh

      # myjsvc This shell script takes care of starting and stopping

      #

      # chkconfig: - 60 50

      # description: tlstat stat is a stat data daemon.

      # processname: webservice_engineJSVC

      # Source function library.

      . /etc/rc.d/init.d/functions

      RETVAL=0

      prog="webservice_engineJSVC"

      # jdk的安装目录

      JAVA_HOME=/usr/lib/java/jdk1.6.0_45

      #应用程序的目录

      MYJSVC_HOME=/test

      #jsvc所在的目录

      DAEMON_HOME=/usr/lib/tomcat//apache-tomcat-6.0.28/bin

      #用户

      MYJSVC_USER=root

      # for multi instances adapt those lines.

      TMP_DIR=/var/tmp

      PID_FILE=/var/run/tlstat.pid

      #程序运行是所需的jar包,commons-daemon.jar是不能少的

      CLASSPATH=/usr/lib/webservice_engine.jar:/usr/lib/tomcat/apache-tomcat-6.0.28/bin/commons-daemon.jar:

      case "$1" in

      start)

      #

      # Start TlStat Data Serivce

      #

      $DAEMON_HOME/jsvc -user $MYJSVC_USER -home $JAVA_HOME -Djava.io.tmpdir=$TMP_DIR -wait 10 -pidfile $PID_FILE #控制台的输出会写到tlstat.out文件里

      -outfile $MYJSVC_HOME/log/myjsvc.out -errfile '&1' -cp $CLASSPATH #服务启动类

    test.main.WebServiceEngine

      #

      # To get a verbose JVM

      #-verbose # To get a debug of jsvc.

      #-debug exit $?

      ;;

      stop)

      #

      # Stop TlStat Data Serivce

      #

      $DAEMON_HOME/jsvc -stop -pidfile $PID_FILE test.main.WebServiceEngine

      exit $?

      ;;

      *)

      echo "Usage Webjsvc start/stop"

      exit 1;;

      esac

      5. 把myjsvc文件拷贝到/etc/init.d/目录下 

      6. #chmod -c +x /etc/init.d 

      7. 添加,启动服务 

      #sudo sysv-rc-conf webservice_engineJSVC on

      你可以从/test/log/myjsvc.out文件里看到如下信息: 

      execute init(args) method 

      execute start method 

      #service myjsvc stop 

      你会发现/test/log/myjsvc.out文件里会增加如下信息 

      execute stop method 

      execute destroy method 

      并且在系统重启时会自动启动myjsvc服务 

      好了,一个简单的 liunx服务就写好了,你可以在TestJsvc的init(),start(),stop(),destroy()方法里添加你的业务,做你想做的事。 

    下面讲解jsvc 启动Java 在Linux下的实现原理。 

    jsvc 是在apache的daemon项目下的开源项目,主要功能可以使一些运行在普通用户下的java进程获取一些root权限下的权利,比如端口在1024下等。 

    如何运行? 

    在自己的java代码中,实现start, init , stop,destroy的方法,将自己的编译打成jar文件,  通过调用jsvc 来启动

    ./jsvc -java-home  /usr/java/jdk1.7.0_09/ -user nobody  -pidfile /opt/apache-tomcat_1/logs/catalina-daemon1.pid -wait 10 -errfile "/tmp/error" -outfile "/tmp/output" -debug -classpath /root/test.jar:/root/commons-daemon.jar test 

    几个注意点: 

    commons_daemon.jar文件是用于调用你的class文件, 

    关于-java-home, 在这里有一个bug(https://issues.apache.org/jira/browse/DAEMON-268),哪怕指定,也会指定为默认的/usr/java 

    实现原理? 

    jsvc 是一个源码是c的程序,通过fork出子进程去启动java,而进程成为控制进程,可以实现监视java子进程的目地。

    改变启动虚拟机的进程用户id和用户组

    通过调用setgid,setuid来改变当前进程的用户id和组,这里要注意的是当改变用户id和组的时候,当前进程会改变进程的capability, 所以需要reset 进程的capability。

    查看进程的capability可以通过内核调用 __NR_capget / __NR_capset 的方式

    static int get_legacy_caps(){  

            struct __user_cap_header_struct caphead;  

            struct __user_cap_data_struct  cap;  

            memset(&caphead, 0, sizeof caphead);  

            caphead.version = LEGACY_CAP_VERSION;  

            if (syscall(__NR_capget, &caphead, &cap) < 0)  

                    log_error("capget failed: %m");  

            log_debug("PID is %d print the cap  0x%x, 0x%x, 0x%x ", getpid(), cap.effective, cap.permitted, cap.inheritable);  

            return 0;  

    启动java

    通过调用JNI_CreateJavaVM 启动虚拟机器,同时调用包common-daemon里的DaemonLoader class, 调用你所写的类中的start,...这些方法。

    碰到的问题

    在jsvc 里启动java以后就将jvm的虚拟机的进程的capability 设置成了0,  导致在虚拟机里的创建线程受到max process 的控制, ulimit -u

    已经创建issue: https://issues.apache.org/jira/browse/DAEMON-270, 短期解决办法可以设置ulimit 到比较大的值。

  • 相关阅读:
    shell
    梯度,也即该物理参数的变化率,导数
    一些石油类核心期刊
    泰勒展开
    向量范数
    添加打印机
    泛函
    9.3.4 BeaufitulSoup4
    9.3.3 scrapy 框架
    9.3.2 网页爬虫
  • 原文地址:https://www.cnblogs.com/timssd/p/5628214.html
Copyright © 2011-2022 走看看