我有一个非常简单的.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`)