Bashrc、shell 脚本和 crontab

IDK*_*IDK 2 bash scripts cron bashrc

/home/my_username/.bashrc我正在尝试使用由 crontab 执行的 shell 脚本中定义的函数。

#crontab -l

# m h  dom mon dow   command
  * *  * * * /bin/sh /home/my_username/CronTab_shell_script.sh >> /home/my_username/Desktop/file.log  
Run Code Online (Sandbox Code Playgroud)

假设我将 Mounted() 函数保存在

/home/my_username/.bashrc 

function mounted(){

    if mount|grep $1; then
    echo "mounted"
    else
    echo "not mounted"
    fi

 }
Run Code Online (Sandbox Code Playgroud)

如何从

/home/my_username/CronTab_shell_script.sh
Run Code Online (Sandbox Code Playgroud)

joe*_*dle 7

1.运行正确的shell

* *  * * * /bin/sh .....
Run Code Online (Sandbox Code Playgroud)

你不是在运行bash,你是在运行sh,所以你不应该期望.bashrc被加载!

试试这个:

* *  * * * /bin/bash .....
Run Code Online (Sandbox Code Playgroud)

2.解决Ubuntu默认的.bashrc问题

另一个问题可能是 Ubuntu 的默认.bashrc脚本以这个守卫开头:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
Run Code Online (Sandbox Code Playgroud)

您在下面添加的任何行都不会被您的 cron 脚本加载,因为 cronjobs 不在交互式环境中运行。

解决方案:将脚本的函数置于此防护之上为该防护之下的用户保留设置。

3.加载完整的用户登录环境

在某些系统上,我发现最容易使用它--login来确保 shell 加载的内容与我在命令行中加载的内容相同。

* *  * * * bash --login /path/to/script.sh

* *  * * * bash --login -c "your command here"
Run Code Online (Sandbox Code Playgroud)