我在 crontab 中有以下行。
@reboot /usr/bin/teamspeak3-server_linux-amd64/ts3server_minimal_runscript.sh
当我重新启动时,脚本在后台运行(即我的 Teamspeak 3 服务器启动),但我试图找到如何停止它(我不能只按 ctrl+c 终端,因为它现在在后台运行) 。一篇论坛帖子说可以使用下面的命令来终止该进程。
ps -ef | grep -i XXXX: to find your background running process
kill OID : kill your unnecessary process
我以为他说的 OID 是指 PID。然而,当我尝试将此应用到我的场景时,我发现三个进程正在运行,如下所示。
$ps -ef | grep ts3
server 889 586 0 22:33 ? 00:00:00 /bin/sh -c /usr/bin/teamspeak3-server_linux-amd64/ts3server_minimal_runscript.sh
server 890 889 0 22:33 ? 00:00:00 /usr/bin/teamspeak3-server_linux-amd64/ts3server_minimal_runscript.sh
server 903 890 0 22:33 ? 00:00:00 ./ts3server_linux_amd64
我很困惑。为什么有三个进程在运行?我期望只看到一个脚本正在运行(即,我想象只有中间一行)。我可以杀死所有三个进程,我想这会停止我的脚本,但我想了解为什么这里有三个进程而不是一个?
答案1
第一个进程是运行脚本的 shell。
第二个进程是该脚本的 shell 子进程,可能是由于在括号内运行的命令导致进程分叉。一个例子是:“(日期;猫)”。
第三个进程是您要运行的实际服务器的二进制文件。
如果要杀死服务器,请杀死第三个进程。这可能会导致子进程退出,然后主 shell 脚本退出。然而,子进程可能是一个shell循环,等待服务器死掉然后重新启动。因此,您可能必须杀死第二个和第三个进程才能阻止其重生。
大多数设计为在后台运行的程序都有更好的方法供您杀死它们。例如,在 /etc/init.d 中启动的守护进程通常可以通过使用“start”、“stop”、“restart”等参数调用脚本来控制。您的服务器可能有类似的系统。
答案2
有 3 个进程正在运行,因为您正在运行 1 个脚本,并且该脚本中写入了运行其他应用程序的命令:
Bash
(运行脚本)- 其
script
本身。 - 这
app
。
脚本内部:
root@onare:/home/onare# cat Downloads/TeamSpeak3-Client-linux_amd64/ts3client_runscript.sh
#!/bin/bash
export KDEDIRS=
export KDEDIR=
export QTDIR=.
export QT_PLUGIN_PATH=.
export LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH"
D1=$(readlink -f "$0")
D2=$(dirname "${D1}")
cd "${D2}"
if [ -e ts3client_linux_x86 ]; then
./ts3client_linux_x86 $@
else
./ts3client_linux_amd64 $@
fi
如果您想知道使用 grep 运行的所有进程,可以使用以下命令:
pgrep ts3
将提示所有匹配的PID*ts3*
然后运行:
kill -9 $(pgrep ts3)
这将杀死所有运行 ts3 的 PID。
SS: