基拉尔没有';如果我从bash脚本调用它,它将无法工作

基拉尔没有';如果我从bash脚本调用它,它将无法工作,bash,shell,scripting,taskkill,ash,Bash,Shell,Scripting,Taskkill,Ash,我在一个脚本中启动了一个tcpdump,我还从同一个脚本中终止了它。因此,我目前正在为此使用killall命令:脚本从udev规则执行:这是一个部分,它应该终止tcpdump:此外,我还使用-s SIDKILL,因为我已经读到这也有帮助 killall没有终止tcpdump的问题是什么。当我手动启动脚本时,一切正常 if [[ "$pid1" != "" ]];then sudo killall -s SIGKILL tcpdump sh /tmp/sc

我在一个脚本中启动了一个
tcpdump
,我还从同一个脚本中终止了它。因此,我目前正在为此使用
killall
命令:脚本从
udev
规则执行:这是一个部分,它应该终止
tcpdump
:此外,我还使用
-s SIDKILL
,因为我已经读到这也有帮助

killall
没有终止
tcpdump
的问题是什么。当我手动启动脚本时,一切正常

 if [[ "$pid1" != "" ]];then
          sudo killall -s SIGKILL tcpdump
          sh /tmp/scripts/autoumount.sh &
          sudo kill -9 $$
          echo "autodump stopped"

由于您是从同一个脚本启动tcpdump,因此不需要使用
killall

如果正在运行多个后台进程,请使用数组,如下所示:

pids=( )                 # initialize empty array
tcpdump & pids+=( "$!" ) # extend said array
…稍后,您可以杀死这些PID:

kill "${pids[@]}"

您的用户能在没有密码的情况下执行
sudo
吗?顺便说一句,sigkill在这里是个坏主意——它会阻止tcpdump刷新其缓冲区,因此您的捕获结束被切断。最好还是使用默认的sigterm。另外,在执行
kill-9$$
(杀死脚本本身)之后,您希望如何执行任何操作?另外,这个脚本是以什么用户的身份运行的?与其让
sudo
在没有TTY的情况下运行且参数范围不受限制,不如干脆以root用户身份运行整个程序(并酌情删除特定命令的权限)。顺便说一句,
if[[$pid1]]
将是编写
if
语句的更干净的方法。在禁止字符串拆分和全局扩展的
[[]]
中不需要引号,默认测试操作是
-n
,检查非空字符串。我已经做了这个选项,但我把它搞砸了一点,因为它启动了不止一个tcpdump,所以我现在只使用killall。确切地说,是什么代码,启动多个tcpdump?即使一个进程中有多个线程(并且您有一个为线程提供单个进程表条目的操作系统),杀死主线程也应该将其全部关闭。相反,如果在循环中运行,则应在数组中收集PID。