在 cron 下运行 .sh 时 pkill -P 变量不起作用

在 cron 下运行 .sh 时 pkill -P 变量不起作用

我有一个非常简单的.sh脚本来终止进程。进程将其 PID 保存到pid2.txt.

pkill -e -P $(cat pid2.txt)
exit

当我从命令行运行它时,sudo ./myscript.sh它工作正常。

当由 cron 运行时,*/2 * * * * /etc/mylocation/myscript.sh它会抛出错误:

cat: pid2.txt: No such file or directory pkill: option requires an argument -- 'P'

我究竟做错了什么?

答案1

cron 作业不一定使用您在交互式会话中碰巧拥有的同一工作目录运行。这意味着该文件pid2.txt可能无法在您认为的位置可用。更改脚本,使其使用pid2.txt文件的绝对路径。

您也可以exit从脚本末尾删除。它没有任何作用。

答案2

pid2.txt在脚本中添加完整路径,然后它将起作用

解释: cron 作业在一个非常小的环境中运行,并且由于它们是由 crond 直接执行而无需 shell(除非您强制创建一个),因此永远不会发生常规 shell 设置。因此,您需要显式指定 cron 调用的所有文件、脚本的路径

答案3

像前面所述的 Cron 作业不具有相同的环境变量(源自profile脚本bashrc),而且通常不应该具有相同的环境变量。

为了解决这个问题,我倾向于附加--login#!/bin/bash以获取相同的变量(二进制文件和库的路径)等。

下面的示例将允许pkill在以下情况下运行cron

#!/bin/bash --login
pkill -e -P $(`cat /home/userid/pid2.txt`)

相关内容