我是 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
如果需要,我也可以修改。
几种方式:
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.