我是 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。