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

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

我是 shell 脚本的新手。假设我启动了一个这样的脚本。这个脚本运行了 3 天。因此,我将通过 ssh 远程启动该脚本,然后关闭本地终端。

启动脚本

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

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

答案1

有几种方法:

终止脚本的任何实例:

pkill -f start.sh

start.sh这将在命令行中使用以下命令终止任何进程pkill

终止脚本的特定实例:

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

#! /bin/bash
echo $$ >> /tmp/start_sh.pid
end=...

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

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

这将终止所有script.sh进程。

与交流start.sh

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

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

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

#! /bin/bash   
echo "KILL" > ~/kill_start.sh

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
    ...

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

#! /bin/bash
echo anything at all

这将使用mkfifo制作命名管道。然后read将尝试从该管道读取,并等待直到它收到任何输入,然后继续出口。这应该会立即生效。


使用screen

使用screen,您可以通过 SSH 启动 shell,关闭连接,然后稍后恢复。因此,您可以screen为脚本启动会话,关闭连接,去度假,回来后,重新调用屏幕连接并使用 终止脚本CtrlC

相关内容