Linux 如何在不终止当前执行的行的情况下终止shell脚本
我正在运行一个shell脚本,类似于bash中的Linux 如何在不终止当前执行的行的情况下终止shell脚本,linux,bash,shell,Linux,Bash,Shell,我正在运行一个shell脚本,类似于bash中的sh script.sh。脚本包含许多行,其中一些行需要几秒钟,其他行需要几天才能执行。如何杀死sh命令而不杀死其当前正在运行的命令(脚本中的当前行)?您没有确切指定“杀死”脚本时应该发生什么,但我假设您希望当前正在执行的行完成,然后在执行任何其他工作之前退出 这可能只有通过对脚本进行编码,使其能够接收这样一个kill命令并以适当的方式响应才能最好地实现——我认为在linux中没有任何魔法可以做到这一点 例如: 您可以捕获一个信号,然后设置一个变
sh script.sh
。脚本包含许多行,其中一些行需要几秒钟,其他行需要几天才能执行。如何杀死sh
命令而不杀死其当前正在运行的命令(脚本中的当前行)?您没有确切指定“杀死”脚本时应该发生什么,但我假设您希望当前正在执行的行完成,然后在执行任何其他工作之前退出
这可能只有通过对脚本进行编码,使其能够接收这样一个kill命令并以适当的方式响应才能最好地实现——我认为在linux中没有任何魔法可以做到这一点
例如:
- 您可以捕获一个信号,然后设置一个变量
- 检查是否存在文件(例如
)touch/var/tmp/trigger
SIGKILL
(-9)-如果有人将它发送到您的进程,那么它将死亡
HTH,Ace您还没有明确指定在“终止”脚本时应该发生什么,但我假设您希望当前执行的行完成,然后在执行更多工作之前退出 这可能只有通过对脚本进行编码,使其能够接收这样一个kill命令并以适当的方式响应才能最好地实现——我认为在linux中没有任何魔法可以做到这一点 例如:
- 您可以捕获一个信号,然后设置一个变量
- 检查是否存在文件(例如
)touch/var/tmp/trigger
SIGKILL
(-9)-如果有人将它发送到您的进程,那么它将死亡
HTH,Ace我能想到的实现这一点的唯一方法是父进程捕获kill信号,设置一个标志,然后在脚本中执行另一个命令之前重复检查该标志 然而,子流程也需要对kill信号免疫。然而,bash在这种方式下的行为似乎与ksh不同,下面的代码似乎可以正常工作
#!/bin/bash
QUIT=0
trap "QUIT=1;echo 'term'" TERM
function terminated {
if ((QUIT==1))
then
echo "Terminated"
exit
fi
}
function subprocess {
typeset -i N
while ((N++<3))
do
echo $N
sleep 1
done
}
while true
do
subprocess
terminated
sleep 3
done
#/bin/bash
退出=0
陷阱“退出=1;回显‘术语’”术语
功能终止{
如果((退出==1))
然后
回声“终止”
出口
fi
}
功能子流程{
排版
而((N++我能想到的实现这一点的唯一方法是父进程捕获kill信号,设置一个标志,然后在执行脚本中的另一个命令之前反复检查该标志
然而,子进程也需要对kill信号免疫,但是bash的行为似乎与ksh不同,下面的代码似乎可以正常工作
#!/bin/bash
QUIT=0
trap "QUIT=1;echo 'term'" TERM
function terminated {
if ((QUIT==1))
then
echo "Terminated"
exit
fi
}
function subprocess {
typeset -i N
while ((N++<3))
do
echo $N
sleep 1
done
}
while true
do
subprocess
terminated
sleep 3
done
!/bin/bash
退出=0
陷阱“退出=1;回显‘术语’”术语
功能终止{
如果((退出==1))
然后
回声“终止”
出口
fi
}
功能子流程{
排版
而((N++我假设您的脚本运行了几天,然后您不会只想在不知道其子脚本是否完成的情况下杀死它
使用ps
查找流程的pid
然后
我假设你的脚本运行了几天,然后你不想在不知道它的一个孩子是否完成的情况下杀死它
使用ps
查找流程的pid
然后
我相信你不能。但是,你可能已经聪明地编写了你的脚本…我相信你不能。但是,你可能已经聪明地编写了你的脚本…是的-这正是我所需要的。非常感谢!在测试任何子进程和杀死子进程之间,父进程有一个巨大的机会产生另一个子进程正在生成父进程。是的,当创建新的子进程时,while循环存在并且父进程被终止,这被理解为intentionYes-这正是我所需要的。非常感谢!在测试任何子进程和终止pare之间,父进程有一个巨大的机会来生成另一个子进程是的,当创建新的子对象时,while循环存在,父对象被杀死,这被理解为意图