当脚本与终端分离时,无需 kill 即可关闭脚本

当脚本与终端分离时,无需 kill 即可关闭脚本

我有一个 bash 脚本任务,要求如下:

“脚本在脱离终端时必须能够轻松关闭,而无需使用 ps、pgrep、pkill 等”

由于我的知识(和搜索)有限,我找不到任何方法。你知道他们指的是什么吗?

答案1

这是一个常见的设计要求守护进程进程,您希望它们大多数时间在后台运行,但偶尔需要与它们交互(例如,杀死它们)。理论上,您可以手动执行等pspgrep并向您找到的任何 PID 发送信号,但对于用户来说,这样做通常很不方便。

做这种事情的传统方法是通过PID 文件,这是您的后台进程在文件系统中一致的位置创建的文件,以便其他进程或脚本可以与其通信。您可以将其放在任何位置,但它们通常位于:

  • /run/<name>.pid对于系统级流程。(例如lightdm在我的计算机上)
  • /run/user/<UID>/<name>.pid对于用户级进程(例如rofi在我的计算机上)

这样做还有一个好处,就是确保每次只运行一个脚本实例(如果需要)。如果要运行多个实例,则必须想出一个命名或定位方案来适应这种情况。

通常的范例是让您的守护进程脚本(例如myscript)在启动时创建此文件并将其自己的 PID 写入文件,然后让单独的控制器脚本(常见命名约定为myscriptctl)读取该文件并在您的例子中终止相关进程。在大多数 shell(包括 bash)中,您可以使用特殊$$变量获取当前进程 ID。我在下面放了一个示例脚本和控制器:


myscript.sh

# Create PID file
PIDFILE=/run/user/$UID/myscript.pid
echo $$ > $PIDFILE

# Do whatever your script should do in the background
while true; do
    echo "Hello world!";
    sleep 5;
done

myscriptctl.sh

# Read PID file
PIDFILE=/run/user/$UID/myscript.pid
PID=$(cat $PIDFILE)

# Interact with that process
if [ $1 = "kill" ]; then
    kill $PID
    rm $PIDFILE
fi

相关内容