通过另一个脚本文件停止正在运行的脚本

Pra*_*nna 3 bash scripts

我是 shell 脚本的新手。说,我开始一个这样的脚本。这将运行 3 天。所以,我将通过 ssh 远程启动脚本,然后关闭我的本地终端。

启动文件

end=$((SECONDS+259200))
x=1
while [ $SECONDS -lt $end ]
do
    #Some command
done
Run Code Online (Sandbox Code Playgroud)

stop.sh每当我想停止脚本时,我将如何编写停止脚本?start.sh如果需要,我也可以修改。

mur*_*uru 8

几种方式:

杀死脚本的任何实例:

pkill -f start.sh
Run Code Online (Sandbox Code Playgroud)

这将start.sh在其命令行中使用pkill.

杀死脚本的特定实例:

修改脚本以将其 PID 保存在某处:

#! /bin/bash
echo $$ >> /tmp/start_sh.pid
end=...
Run Code Online (Sandbox Code Playgroud)

并告诉stop.sh用那里的 PID 终止进程:

#! /bin/bash
kill $(cat /tmp/start_sh.pid) || echo "Process is not running."
Run Code Online (Sandbox Code Playgroud)

这将杀死所有script.sh进程。

与交流 start.sh

告诉start.sh读取一些文件告诉退出:

#! /bin/bash
...
while [ $SECONDS -lt $end ]
do
    [[ $(cat ~/kill_start.txt) == "KILL" ]] && exit 1
    ...
Run Code Online (Sandbox Code Playgroud)

并告诉stop.sh将“KILL”写入该文件:

#! /bin/bash   
echo "KILL" > ~/kill_start.sh
Run Code Online (Sandbox Code Playgroud)

这将start.sh在每个脚本的下一次迭代运行时终止 , 的所有实例。

(尽管名称kill_start.sh不是脚本。)

使用命名管道进行通信

或者,您可以在脚本中运行后台作业以监视对以下内容的更改~/kill_start.sh

#! /bin/bash
...
[[ -p ~/kill_script.sh ]] && mkfifo ~/kill_script.sh
(read -N 0 < ~/kill_script && [[ $REPLY == "KILL" ]] && kill 0) &

while [ $SECONDS -lt $end ]
do
    ...
Run Code Online (Sandbox Code Playgroud)

在 中stop.sh,将任何内容回显到~/kill_script

#! /bin/bash
echo anything at all
Run Code Online (Sandbox Code Playgroud)

这将用于mkfifo制作命名管道。然后read将尝试从该管道读取,并等待它获得任何输入,然后继续退出。这应该几乎立即生效。


screen

使用screen,您可以通过 SSH 启动一个 shell,关闭您的连接,然后再恢复它。因此,您可以screen为该脚本启动一个会话、关闭您的连接、去度假、回来、调用您的屏幕连接并使用CtrlC.