为什么一个脚本运行三个进程?

为什么一个脚本运行三个进程?

我在 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 个脚本,并且该脚本中写入了运行其他应用程序的命令:

  1. Bash(运行脚本)
  2. script本身。
  3. 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:

附:列表

相关内容