Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在不终止当前执行的行的情况下终止shell脚本_Linux_Bash_Shell - Fatal编程技术网

Linux 如何在不终止当前执行的行的情况下终止shell脚本

Linux 如何在不终止当前执行的行的情况下终止shell脚本,linux,bash,shell,Linux,Bash,Shell,我正在运行一个shell脚本,类似于bash中的sh script.sh。脚本包含许多行,其中一些行需要几秒钟,其他行需要几天才能执行。如何杀死sh命令而不杀死其当前正在运行的命令(脚本中的当前行)?您没有确切指定“杀死”脚本时应该发生什么,但我假设您希望当前正在执行的行完成,然后在执行任何其他工作之前退出 这可能只有通过对脚本进行编码,使其能够接收这样一个kill命令并以适当的方式响应才能最好地实现——我认为在linux中没有任何魔法可以做到这一点 例如: 您可以捕获一个信号,然后设置一个变

我正在运行一个shell脚本,类似于bash中的
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循环存在,父对象被杀死,这被理解为意图