我想在我的Teamspeak3上安装一个bot,并在启动时将该bot作为守护进程运行。我编写了自己的脚本并将其复制到init.d,然后将其与update-rc.d
一起添加到默认值。
#!/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的进程。
root@vps-1023645-8462:~# service jts3 start
Starting jts3 ...
jts3 started ...
root@vps-1023645-8462:~# cat /home/ts/jts3/pid
10206
root@vps-1023645-8462:~# 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
答案 0 :(得分: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 :(得分:1)
此行中有错误:
sudo -u $USER -c nohup java -jar $DIR/JTS3ServerMod.jar $DIR 2>>/dev/null >>/dev/null&
您似乎混合了sudo
和su
的语法。在版本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 &