Bash 脚本在 root 中工作但不在 crontab 中工作

Bash 脚本在 root 中工作但不在 crontab 中工作

我试图在 Linux 启动时执行 bash 脚本,但它不起作用。我已经在 crontab 中尝试了所有这些命令:

@reboot bash /home/user/mysqlamazon.sh
@reboot sh /home/user/mysqlamazon.sh
@reboot /home/user/mysqlamazon.sh
@reboot sleep 60 && /home/user/mysqlamazon.sh

我在 crontab 上还有另一个完美运行的命令:

@reboot pwsh file.ps1

我也尝试过这个命令:

@reboot pwsh file.ps1 && sh /home/user/mysqlamazon.sh

这些都不起作用!任何帮助,将不胜感激!

以下是 bash 脚本的内容:

while($true)
do
./transfermysql.sh > file.txt
bcp tablename in file.txt -S ***********.com,**** -U **** -P *********** -d ********* -c
:> file.txt
sleep 60
done

答案1

您没有告诉我们这是如何失败的,但我猜您没有看到它被执行。

首先,你的脚本永远不会工作,因为while($true)它不是有效的 shell 语法。我假设你想要这样的东西:

true=1
while(($true)); do ... ; done

更常见的习语是:

while : ; do ... ; done

或者(true是命令):

while true; do ... ; done

这很可能是因为您在脚本中使用相对路径:

./transfermysql.sh > file.txt

将其替换为完整路径:

/path/to/transfermysql.sh > /path/to/file.txt

接下来,我还怀疑它bcp不在 cron 的 PATH 中,因此也使用它的完整路径:

/path/to/bcp tablename in file.txt -S ***********.com,**** -U **** -P *********** -d ********* -c

最后,我不知道为什么你会想要,:> file.txt因为你的第一个命令无论如何都会覆盖它的内容,但如果你出于某种原因确实需要它,你也需要使用那里的完整路径:> /path/to/file.txt

答案2

通过cron、 或at、 或运行的作业batch不会在桌面上的同一运行时环境中运行。您的任何PATH更改或其他环境变量设置都不会自动传播到您的cron作业。例如,没有$DISPLAY,因此 GUI 程序需要特殊处理(读取man xhost)。

可以在Read 文件cron中为所有作业设置环境变量。crontabman 5 crontab

echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias查看每个环境中的结果 。

由于默认情况下,command该行的部分由 解释,它的语法比 更简单,因此我建议调用一个脚本(可执行文件,已安装,以 开头)来设置环境,然后调用所需的程序。crontab/bin/sh/bin/bashcommandbash#!/bin/bash

相关内容