【问题标题】:Search and kill process, and start new process on bash script搜索并杀死进程,并在 bash 脚本上启动新进程
【发布时间】:2017-02-17 19:51:43
【问题描述】:

我需要一个脚本来每小时运行一个新进程。

我创建了一个 bash 脚本,该脚本计划通过 cron 每小时运行一次。它只在第一次工作,否则失败。

如果从 shell 运行,它可以完美运行。

这是脚本:

#!/bin/sh

ps -ef | grep tcpdump | grep -v grep | awk '{print $2}' | xargs kill
sleep 2
echo "Lanzando tcpdump"
tcpdump -ni eth0 -s0 proto TCP and port 25  -w /root/srv108-$(date +%Y%m%d%H%M%S).smtp.pcap

定时任务

@hourly /root/analisis.sh > /dev/null 2>&1

为什么 cron 作业失败了?

【问题讨论】:

  • 这不是 Bash 脚本(shebang 另有说明)。
  • How does it fail? 你不能用killall,或者至少pidof吗?
  • 要尝试自己调试,请将 cron 行更改为将 stdout 和 stderr 记录到文件中,然后运行 ​​set -x 或在第一行添加 -x 以打开调试。 Cron 没有与常规 shell 命令相同的环境,因此您可能只是缺少路径中的命令。尝试为 kill 行中的命令提供完整路径。
  • 哦,调试的时候,复制kill行,看看每一步的输出。可能 ps 根据环境有不同的输出格式。在cron中设置命令每分钟运行一次,可以快速调试。
  • 请不要在标题中添加“已解决”。相反,发布解决方案的答案:Can I answer my own question?

标签: linux bash shell cron kill


【解决方案1】:

这是 OP added 对问题本身的回答。

在 cmets 之后更正脚本(效果很好)

#!/bin/bash

pkill -f tcpdump
/usr/sbin/tcpdump -ni eth0 -s0 proto TCP and port 25  -w /root/srv108-$(date +%Y%m%d%H%M%S).smtp.pcap

也就是说,我只需要使用tcpdump 的完整路径。

【讨论】:

    【解决方案2】:

    失败可能与 cron 作业从未完成有关 - 您正在前台启动一个新的 tcpdump,它将永远运行。

    试试这个简化的脚本:

    #!/bin/bash
    killall tcpdump
    tcpdump -ni eth0 -s0 proto TCP and port 25  -w /root/srv108-$(date +%Y%m%d%H%M%S).smtp.pcap&
    

    【讨论】:

    • 快速回答。你说的真的没问题。通过调试,我看到了问题。 /root/analisis.sh: línea 7: tcpdump: no roder found.
    • @abkrim 如果缺少路径是问题所在,它是如何第一次工作的?
    • 环境。您的问题的 Awnser 是在较旧的 cmets 上,而不是在这个系统上的用户的 bash 环境,即 cron,@SirAthos
    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    相关资源
    最近更新 更多