2014-06-17 133 views
3

我想安装一个bot到我的Teamspeak3并在启动时运行这个僵尸守护程序作为守护进程。我写了自己的脚本并将其复制到init.d,然后将其与update-rc.d一起添加为默认值。在Linux上运行jar文件作为守护进程Ubuntu

#!/bin/sh 
# 
# JTS3ServerBot Script 
# 
USER="ts" 
NAME="jts3" 
DIR="/home/ts/jts3/" 
case $1 in 
    start) 
     echo "Starting ${NAME} ..." 
     if [ ! -f $DIR/pid ]; then 
      sudo -u $USER -c nohup java -jar $DIR/JTS3ServerMod.jar $DIR 2>> /dev/null >> /dev/null & 
      echo $! > $DIR/pid 
      echo "${NAME} started ..." 
     else 
      echo "${NAME} is already running ..." 
     fi 
    ;; 
    stop) 
     if [ -f $DIR/pid ]; then 
      PID=$(cat $DIR/pid); 
      echo "Stopping ${NAME} ..." 
      kill $PID; 
      echo "${NAME} stopped ..." 
      rm $DIR/pid 
     else 
      echo "${NAME} is not running ..." 
     fi 
    ;; 
    restart) 
     if [ -f $DIR/pid ]; then 
      PID=$(cat $DIR/pid); 
      echo "Stopping ${NAME} ..."; 
      kill $PID; 
      echo "${NAME} stopped ..."; 
      rm $DIR/pid 

      echo "Starting ${NAME} ..." 
      sudo -u $USER -c nohup java -jar $DIR/JTS3ServerMod.jar $DIR 2>> /dev/null >> /dev/null & 
      echo $! > $DIR/pid 
      echo "${NAME} started ..." 
     else 
      echo "${NAME} is not running ..." 
     fi 
    ;; 
esac 

生成一个pid文件,但如果我尝试杀死与此pid进程我得到一个错误,该进程不存在。如果我使用top,则列出的PID没有任何过程。

[email protected]:~# service jts3 start 
Starting jts3 ... 
jts3 started ... 
[email protected]:~# cat /home/ts/jts3/pid 
10206 
[email protected]:~# kill 10206 
bash: kill: (10206) - No such process 

    PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND   
1762 ts  20 0 1881m 14m 3408 S 0 1.4 215:47.28 ts3server_linux  
32356 ts  20 0 164m 1576 1336 S 0 0.2 0:09.85 tsdnsserver_lin 
+1

您正在捕获'sudo'的PID,而不是'java' ...'sudo'可能会在'nohup'在运行您的'java'命令后退出后退出。 – twalberg

+0

@twalberg这应该是一个答案,而不是评论。 –

+0

另外,为了避免捕获sudo PID,你应该使用'ps -ef | grep JTS3ServerMod.jar | awk'{print $ 2}''。这应该给你正在运行的进程的PID。 –

回答

8

我发现了另一个解决方案,用于解决我的问题。我使用upstart(仅适用于Ubuntu)运行我的jar-File作为守护进程。 Upstart管理PID。只需将myservice.conf添加到/etc/init(而不是/etc/inid.d),守护进程将在启动时启动,并且可以将其作为服务进行管理。你不必让文件可运行的或其他任何

您可以管理服务为正常例如

service myservice restart 
service myservice status 
... 

我的配置文件中:

description "myservice" 
author "your name" 

start on runlevel [3] 
stop on shutdown 

expect fork 

script 
    cd /home/username/ 
    sudo -u username java -jar /home/username/myservice/myservice.jar >/home/username/myservice.log 2>&1 
    emit myservice_running 
end script 

该解决方案是非常容易和在我的Ubuntu 12.04服务器上运行良好。

1

您在此行中有一个错误:

sudo -u $USER -c nohup java -jar $DIR/JTS3ServerMod.jar $DIR 2>>/dev/null >>/dev/null& 

你似乎是混合的sudosu的语法。在版本1.8之前,sudo没有-c选项 - 您只需为其提供在任何其他选项之后运行的命令。在1.8中有一个-c选项,但它不用于指定命令(这是为了将资源使用限制为给定登录类的资源使用)。 sudo正在打印有关此无效语法的错误消息,但您没有看到它,因为您将所有输出重定向到/dev/null

只要简单地除去-c,形成一个有效的命令:

sudo -u $USER nohup java -jar $DIR/JTS3ServerMod.jar $DIR 2>> /dev/null >> /dev/null & 

另外,还可以通过使用2>&1语法发送stderr相同的句柄作为stdout简化命令少了,也没有必要当写入时为追加模式/dev/null

sudo -u $USER nohup java -jar $DIR/JTS3ServerMod.jar $DIR >/dev/null 2>&1 & 
+0

我改变了我的脚本,但该过程仍然无法启动 – Henok

+0

尝试在没有重定向的情况下运行,看看修改后的命令是否打印并显示错误消息。 –

+0

'sudo -u $ USER nohup java -jar $ DIR/JTS3ServerMod.jar'您的意思是我说的没有重定向吗?因为没有发生 – Henok

相关问题