我想使用 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/*
crontab
crontab
此外,由于此脚本对用户主目录中的文件进行操作,因此我会以该用户的身份运行该作业。除了可能写入该日志文件外,该脚本不需要 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)。