下面的脚本在从 CLI 运行时完美运行,但在从 cron 运行时失败并出现错误
"/usr/local/sbin/mtr: Failure to start mtr-packet: Invalid argument"
这是cron
root 自己的条目crontab
:
* * * * * /root/trace_to_fpp.sh >/dev/null 2>&1
起初我以为这是一个权限问题,但似乎并没有遵循错误。下面是正在使用的脚本。
#! /bin/bash
DIR=/var/log/traces/FPP/$(date +%Y-%m-%d)/$(date +"%H")/
DIR_FILE=$DIR$(date +"%M")
mkdir -p $DIR
/usr/local/sbin/mtr -o "L SRD NBAW JMXI" --report-wide --report-cycles 5 --no-dns --aslookup 1.1.1.1 > $DIR_FILE
/usr/local/sbin/mtr -o "L SRD NBAW JMXI" --report-wide --report-cycles 5 --aslookup 1.1.1.1 >> $DIR_FILE
如果这很重要的话,这是在 CentOS 6 上。
答案1
最初,我收到了与OP相同的错误。
经过进一步研究,我发现一旦定义了 PATH,脚本就可以正常工作,因此它可以找到mtr
和mtr-packet
。
我对此进行了测试:CentOS Linux release 8.2.2004 (Core)
cron 似乎使用了不同的路径:
[root@graylog ~]# crontab -l |grep PATH
* * * * * /bin/echo $PATH >> /var/log/cron.log
[root@graylog ~]# tail -n1 /var/log/cron.log
/usr/bin:/bin
我们可以通过在脚本中定义新路径来解决这个问题。下面是驻留在以下位置的脚本/etc/mtr-background.sh
:
#!/bin/bash
export PATH="$PATH:/usr/sbin/"
DIR=/var/log/traces/$(/usr/bin/date +%Y-%m-%d)/$(/usr/bin/date +"%H")/
DIR_FILE=$DIR$(/usr/bin/date +"%M")
mkdir -p $DIR
/usr/sbin/mtr -o "L SRD NBAW JMXI" -w -e -c 60 -4 1.1.1.1 >> $DIR_FILE
下面是在 root 用户帐户下设置的相对 crontab 条目:
* * * * * /etc/mtr-background.sh >> /var/log/cron.log
我找到了完整的路径mtr
并mtr-packet
通过使用whereis
像这样:
[root@graylog ~]# whereis mtr; whereis mtr-packet
mtr: /usr/sbin/mtr /usr/share/man/man8/mtr.8.gz
mtr-packet: /usr/sbin/mtr-packet /usr/share/man/man8/mtr-packet.8.gz
谢谢