2014-06-17 219 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

相關問題