Raspberry pi 中的 Crontab 不是 运行 一个非常简单的脚本
Crontab in Raspberry pi doesn't run a very simple script
我是 Linux 的新手,我在我的 Raspberry Pi 中一直在努力解决这个问题,但没有成功。
首先我在 /home/myfile.sh
中写了一个简单的脚本,如下所示:
#!/bin/bash
clear
echo "hi"
然后我做了 sudo chmod 755 /home/myfile.sh
来授予权限。
最后我修改了 crontab
使用 crontab -e
:
# some comments ...
* * * * * /home/myfile.sh
问题:
当我手动 运行 脚本时它工作正常但是当我在我的 crontab
中设置上面的行时,什么也没有发生。我做错了什么?
Cron 作业 return 默认情况下通过电子邮件发送标准输出和标准错误,因此您需要检查那里以进行测试。
在标准的 raspian 发行版中没有电子邮件 client/agent,因此您需要安装它,例如:
sudo aptitude install bsd-mailx
然后您将能够使用命令 mail
.
检查本地电子邮件
通常 cron 作业不会 return 任何输出将其全部重定向到日志文件。
尝试将输出重定向到这样的文件:
* * * * * /home/myfile.sh > output_file.txt
你会看到它正在工作。
Cron 作业不会输出到您正在使用的同一终端。
编辑
如果您使用 crontab -e
来安排作业,则您使用的是用户的特定 crontab。因此,您只能写入该用户的主目录(或他有权访问的其他目录)。因此,如果您将 cron 作业修改为:
* * * * * /home/myfile.sh > /home/<username>/output_file.txt
您会看到输出已写入用户主目录下的那个文件。
如果要写入其他目录,建议使用/etc/crontab
中的system-widecrontab
顺便说一下,您可能希望为 cron 作业启用日志记录以跟踪问题。您需要编辑 /etc/rsyslog.conf or /etc/rsyslog.d/50-default.conf
文件并确保取消注释以下行,如果缺少则添加它:
cron.* /var/log/cron.log
然后重启rsyslog
和cron
:
sudo service rsyslog restart
sudo service cron restart
现在您可以查看您的命令是否由 cron 运行 执行。
为了展示我是如何设法解决我的问题并希望能帮助他人的,我在这里 post 作为对我自己问题的回答:
我通过使用 系统范围的 crontab (/etc/crontab
) 而不是 per user crontab (crontab -e
).
为了澄清这一点,
/etc/crontab
是系统范围 crontab:
# m h dom mon dow user command
* * * * * someuser echo 'foo'
而 crontab -e
是 每个用户 'crontab':
# m h dom mon dow command
* * * * * echo 'foo'
请注意,在每个用户的 crontab 中没有 'user' 字段。
你可以在 user (crontab -e) 下通过将 PATH
添加到 crontab 文件中来 crontab:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * /home/pi/command
我是 Linux 的新手,我在我的 Raspberry Pi 中一直在努力解决这个问题,但没有成功。
首先我在 /home/myfile.sh
中写了一个简单的脚本,如下所示:
#!/bin/bash
clear
echo "hi"
然后我做了 sudo chmod 755 /home/myfile.sh
来授予权限。
最后我修改了 crontab
使用 crontab -e
:
# some comments ...
* * * * * /home/myfile.sh
问题:
当我手动 运行 脚本时它工作正常但是当我在我的 crontab
中设置上面的行时,什么也没有发生。我做错了什么?
Cron 作业 return 默认情况下通过电子邮件发送标准输出和标准错误,因此您需要检查那里以进行测试。
在标准的 raspian 发行版中没有电子邮件 client/agent,因此您需要安装它,例如:
sudo aptitude install bsd-mailx
然后您将能够使用命令 mail
.
通常 cron 作业不会 return 任何输出将其全部重定向到日志文件。
尝试将输出重定向到这样的文件:
* * * * * /home/myfile.sh > output_file.txt
你会看到它正在工作。
Cron 作业不会输出到您正在使用的同一终端。
编辑
如果您使用 crontab -e
来安排作业,则您使用的是用户的特定 crontab。因此,您只能写入该用户的主目录(或他有权访问的其他目录)。因此,如果您将 cron 作业修改为:
* * * * * /home/myfile.sh > /home/<username>/output_file.txt
您会看到输出已写入用户主目录下的那个文件。
如果要写入其他目录,建议使用/etc/crontab
顺便说一下,您可能希望为 cron 作业启用日志记录以跟踪问题。您需要编辑 /etc/rsyslog.conf or /etc/rsyslog.d/50-default.conf
文件并确保取消注释以下行,如果缺少则添加它:
cron.* /var/log/cron.log
然后重启rsyslog
和cron
:
sudo service rsyslog restart
sudo service cron restart
现在您可以查看您的命令是否由 cron 运行 执行。
为了展示我是如何设法解决我的问题并希望能帮助他人的,我在这里 post 作为对我自己问题的回答:
我通过使用 系统范围的 crontab (/etc/crontab
) 而不是 per user crontab (crontab -e
).
为了澄清这一点,
/etc/crontab
是系统范围 crontab:
# m h dom mon dow user command
* * * * * someuser echo 'foo'
而 crontab -e
是 每个用户 'crontab':
# m h dom mon dow command
* * * * * echo 'foo'
请注意,在每个用户的 crontab 中没有 'user' 字段。
你可以在 user (crontab -e) 下通过将 PATH
添加到 crontab 文件中来 crontab:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * /home/pi/command