【发布时间】:2014-08-07 18:22:27
【问题描述】:
我想在我的 Teamspeak3 中安装一个机器人,并在启动时将此机器人作为守护程序运行。我编写了自己的脚本并将其复制到 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
【问题讨论】:
-
您正在捕获
sudo的PID,而不是java...sudo可能在nohup运行您的java命令后退出后退出。 -
@twalberg 这应该是一个答案,而不是评论。
-
另外,为了避免捕获sudo PID,你应该使用
ps -ef | grep JTS3ServerMod.jar | awk '{print $2}'。这应该会给你正在运行的进程的 PID。 -
@FlorinStingaciu 不确定我是否想回答这个问题,因为它并没有真正解决问题,它只是指出问题出在哪里......一个合适的解决方案可能需要了解正在使用什么发行版,以及是否可以使用
start-stop-daemon或其他类似的脚本/工具... -
@twalberg 这不是原因 - 默认情况下 sudo 不会分叉(它只是 exec 并且只有一个 pid)。这种情况下的问题是一个虚假的参数标志,正如我在回答中详述的那样。
标签: linux bash shell jar daemon