我想杀了一个进程,并删除一个标志,指出进程正在运行。 cron的:
00 22 * * 1-5 pkill -f script.sh >log 2>&1 ; rm lock >log 2>&1
当我在terminal上运行它时,这是完美的。 但在crontab rm没有运行。 我所能想到的是,整个-f标志后面的行被用作pkill的参数。 为什么会发生这种情况?
保持它们作为单独的cron条目正在工作。 另外pkill没有-f标志正在运行(虽然它不杀死进程,因为我想在整个命令中search模式)。
在Windows上执行相当于“杀死进程树”的c ++
循环和睡在bash脚本
实时追踪日志摘录
在C,linux中,关于kill信号和sleep()循环
当父进程被“kill -9”杀死时,subprocess是否也会被杀死?
最后一个分叉的孩子不会死
杀死信号的例子
32和33杀号发生了什么?
简短的回答:它简直就是自杀!
我的答案解释说:如果你让一个命令由一个crond启动它将在一个子shell中执行。 最有可能你会在ps或htop中找到的行看起来像这样:
/bin/sh -c pkill -f script.sh >log 2>&1 ; rm lock >log 2>&1
(细节可能会有所不同,比如你可能有bash而不是sh)
问题是,整行有一个PID(进程id),是使用'-f'参数时pgrep / pkill解析的命令行之一。 如手册页所述:
-f,--full The pattern is normally only matched against the process name. When -f is set,the full command line is used.
现在你的pkill正在寻找正在运行的进程列表中的任何命令行,它以某种方式包含表达式'script.sh',并最终会在某个时刻找到该行。 由于它的发现,它会得到这个PID并终止它。 不幸的是,同样的PID持有你剩下的命令链,只是被自己杀死了。
所以你基本上写了一个“命令的自杀行列”)顺便说一句:我今天做了同样的事情,这就是我怎么找到你的问题。
希望这个答案有帮助,即使有点晚
亲切的问候
今天就遇到这个问题,只想为那些遇到这个问题的人发表一个实际的例子:
pkill -f ^'python3 /Scripts/script.py' > /dev/null 2>&1 ; python3 /Scripts/script.py > /tmp/script.log 2>&1
这将运行pkill并搜索以( regex ^ ) python3 /Scripts/script.py开头的整个命令( -f )。 因此,它不会自杀,因为它不是从该命令开始(它以pkill开头)。
3.141592和nananananananananananaBATMAN的答案是正确的。 我解决了这个问题。
00 22 * * 1-5 pkill -f script.[s][h] >log 2>&1 ; rm lock >log 2>&1
这是因为script.[s][h] (string)与script.[s][h]不匹配script.[s][h] (regex)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。