我使用 Ubuntu 16.04,并以用户身份登录到我的远程机器root
,然后运行以下需要向 Unix cron 添加一些计划任务的脚本:
#!/bin/bash
su USERNAME
crontab -l 2>/dev/null
cat <<- 'EOF'
* * * * * cron-task1...
* * * * * cron-task1...
* * * * * cron-task2...
* * * * * cron-task2...
* * * * * cron-task3...
* * * * * cron-task3...
EOF
exit
由于某种原因,此代码不起作用,即执行后,cron 任务不会从 heredoc 打印到 cron,但任务代码很好,就好像我像在 中一样手动复制它们crontab -e
,它们就可以正常工作。
上述代码可能存在什么问题?谢谢,
Chev_603 的更新:
如果我执行:
su USERNAME
sudo cat <<- 'EOF' > cron.jobs
* * * * * CRON TASKS...
EOF
我得到:
bash:cron.jobs:权限被拒绝
如果我使用文件,我只会更改所有权、组和权限,但sudo chmod +x /home/user/Location/Of/Script
考虑到它是一个 heredoc,我猜情况并非如此。
答案1
尽管该问题被标记为重复,我还是回答了它,因为问题在于cat
和的语法都不crontab
正确。
没有现有的 crontab,并且语法不正确。例如,如果我在未配置 cron 的情况下执行此操作,则会发生以下情况:
$ crontab -l
no crontab for anon
然后您只需将此处文档的内容发送到标准输出即可。
首先创建一个这样的 crontab 文件:
cat <<- 'EOF' > cron.jobs
* * * * * cron-task1...
* * * * * cron-task2...
* * * * * cron-task3...
EOF
crontab cron.jobs
然后确认它有效:
crontab -l
* * * * * cron-task1...
* * * * * cron-task2...
* * * * * cron-task3...
它不起作用的原因是因为crontab -l
它只是将用户 cron 文件的内容显示到标准输出:
从man crontab
:
The -l option causes the current crontab to be displayed on standard output. See the note under DEBIAN SPECIFIC below.
另外,除了使用su
,您还可以使用
cat cron.jobs |crontab -u user -
把所有这些放在一起,将其添加到脚本中,然后说cron.sh
并尝试这个:
#!/bin/bash
user="$@"
cat <<- 'EOF' > cron.jobs
* * * * * cron-task1...
* * * * * cron-task2...
* * * * * cron-task3...
EOF
cat cron.jobs|crontab -u $user -
进而:
bash cron.sh username
但我认为你想要的更像是:
cat <<< '
* * * * * cron-task1... ' |crontab -