您可能会说,有很多方法可以做到这一点。
关于您的“ UPDATE#2”-一般来说,终止父子层次结构中的任何进程通常都会终止所有关联的进程。但是有很多例外。理想情况下,您要终止流程树中的最后一个“子级”,然后,如果该子级的父级没有其他要运行的任务,则应退出。但是,如果您杀死父母,则当父母去世时,信号应传递给孩子,孩子也应退出-但在某些情况下,孩子进程可能会忽略该信号(通过陷阱或类似机制)并可能继续运行一个将被'init'流程(或类似流程)继承。但是这个流程行为的主题可能会变得很复杂,我将其保留在那里...
如果我不想使用控制脚本(如下所述),我喜欢的一种方法是使用“屏幕”实用程序来启动和管理该过程。“屏幕”命令具有很多功能,需要花费一些时间来掌握。我建议您阅读“屏幕”手册页以获取完整说明。一个在后台启动进程的快速示例是以下命令:
屏幕-d -m / path / to / program
这将在“屏幕”会话中启动“ / path / to / program”。
您可以使用以下命令查看正在运行的会话:
屏幕-ls
而且您可以随时使用以下命令重新连接到正在运行的程序:
屏幕-r
然后只需用^ C或其他命令将其终止。
除了可以随意重新连接和断开与进程的连接之外,“屏幕”还可以捕获程序可能产生的任何stdout()。
但是我个人在这些方面的偏爱是要有一个控制程序来管理过程的开始和停止。这可能会变得有些复杂,并且需要一些可能复杂的脚本。像任何脚本一样,有很多不错的方法可以做到这一点。我提供了一个bash示例,该示例通常用于启动和停止应用程序。如果您的任务很简单,则可以将其直接插入控制脚本中,也可以让该控制脚本调用另一个外部程序。请注意,此示例在管理过程方面绝不是全面的。我已经排除了以下情况的可能性:使用“开始”选项时,确保脚本尚未运行,验证正在运行的PID实际上是您启动的进程(例如,脚本尚未启动)。死亡,并且使用相同的PID启动了另一个进程),并验证脚本实际上是在第一个“ kill”请求中响应(退出)的。进行所有这些检查可能会变得很复杂,我不想使示例过于冗长和复杂。您可能想修改该示例以实践您的Shell脚本。
将以下代码保存到一个名为“ programctl”的文件中,使其可通过以下命令执行:
chmod 755程序ctl
然后编辑文件,并在以“ myscript”开头的案例部分中添加您的代码/脚本。
一切就绪后,假设“ programctl”位于当前目录中,则可以使用以下命令启动程序:
./programctl开始
并使用以下命令停止它:
./programctl停止
干杯。
#!/bin/bash
# Description: A wrapper script used to stop/start another script.
#--------------------------------------
# Define Global Environment Settings:
#--------------------------------------
# Name and location of a persistent PID file
PIDFILE="/tmp/tmpfile-$LOGNAME.txt"
#--------------------------------------
# Check command line option and run...
# Note that "myscript" should not
# provided by the user.
#--------------------------------------
case $1
in
myscript)
# This is where your script would go.
# If this is a routine 'bash' shell script, you can enter
# the script below as illustrated in the example.
# Or you could simply provide the path and parameters
# to another script such as /dir/name/command -options
# Example of an embedded script:
while true
do
# do something over and over...
sleep 1
done
# Example of an external script:
/usr/local/bin/longrun -x
;;
start)
# Start your script in the background.
# (Note that this is a recursive call to the wrapper
# itself that effectively runs your script located above.)
$0 myscript &
# Save the backgound job process number into a file.
jobs -p > $PIDFILE
# Disconnect the job from this shell.
# (Note that 'disown' command is only in the 'bash' shell.)
disown %1
# Print a message indicating the script has been started
echo "Script has been started..."
;;
stop)
# Read the process number into the variable called PID
read PID < $PIDFILE
# Remove the PIDFILE
rm -f $PIDFILE
# Send a 'terminate' signal to process
kill $PID
# Print a message indicating the script has been stopped
echo "Script has been stopped..."
;;
*)
# Print a "usage" message in case no arguments are supplied
echo "Usage: $0 start | stop"
;;
esac