使用 cron 每分钟执行一次 shell

使用 cron 每分钟执行一次 shell

我想使用 cron 每分钟运行此 bash 代码。我将其保存到/root/activate.sh

#!/bin/bash

for file in /home/user/torrents/*.torrent

do
if [ "$file" != "/home/user/torrents/*.torrent" ]; then
echo [`date`] "$file" added to queue. >> /var/log/torrentwatch.log
/usr/bin/transmission-remote localhost:9091 -a "$file"
mv "$file" "$file".added
sleep 1
fi
done

权限已设置-rwxrwxrwx 1 root root 278 May 27 01:27 activate.sh

然后crontab -e我把这个放在里面

* * * * * root sh /root/activate.sh

脚本没有执行,我收到此日志错误

May 27 01:40:02 media CRON[3556]: (root) CMD (root sh /root/activate.sh)
May 27 01:40:02 media CRON[3555]: (CRON) info (No MTA installed, discarding output)
---after a minute---
May 27 01:41:01 media CRON[3582]: (root) CMD (root sh /root/activate.sh)
May 27 01:41:01 media CRON[3581]: (CRON) info (No MTA installed, discarding output)

答案1

首先,为什么您不直接使用 transmission 的 watch-dir 功能?

crontab 条目是错误的,当您使用.* * * * * /root/activate.sh添加它时应该是错误的,并且需要一个额外的用户名字段,但是您使用命令设置的用户特定的 crontabs没有用户名字段;作业以运行 . 的用户身份运行。crontab -e/etc/crontab/etc/cron.d/*crontabcrontab

此外,由于此脚本对用户主目录中的文件进行操作,因此我会以该用户的身份运行该作业。除了可能写入该日志文件外,该脚本不需要 root 权限,但您可以更改该日志文件的所有权。

至于脚本,我会对其进行一些修改:

#!/bin/bash

for file in ~user/torrents/*.torrent; do
    [[ -f "$file" ]] || continue
    transmission-remote -a "$file" && mv "$file" "$file.added" || continue
    printf '[%s] %s added to queue\n' "$(date)" "$file"
    sleep 1
done >> /var/log/torrentwatch.log

最后,您应该避免添加脚本扩展,尤其是.sh当脚本是 bash 脚本而不是 sh 脚本时不要使用。

答案2

使用时crontab -e不能指定用户名。格式为:

m h  dom mon dow   command

因此你应该把这个放进去crontab -e

* * * * * /root/activate.sh

您不必使用,sh因为该文件具有执行权限和shebang行(#!/bin/bash)。

相关内容