我有一个 bash 脚本任务,要求如下:
“脚本在脱离终端时必须能够轻松关闭,而无需使用 ps、pgrep、pkill 等”
由于我的知识(和搜索)有限,我找不到任何方法。你知道他们指的是什么吗?
答案1
这是一个常见的设计要求守护进程进程,您希望它们大多数时间在后台运行,但偶尔需要与它们交互(例如,杀死它们)。理论上,您可以手动执行等ps
,pgrep
并向您找到的任何 PID 发送信号,但对于用户来说,这样做通常很不方便。
做这种事情的传统方法是通过PID 文件,这是您的后台进程在文件系统中一致的位置创建的文件,以便其他进程或脚本可以与其通信。您可以将其放在任何位置,但它们通常位于:
这样做还有一个好处,就是确保每次只运行一个脚本实例(如果需要)。如果要运行多个实例,则必须想出一个命名或定位方案来适应这种情况。
通常的范例是让您的守护进程脚本(例如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