一坨间的关系:crontab profile bashrc 登录shell source sh 点杠 点 等知识点

2017-07-09 23:28:21

         今天想起个定时任务,运行一个Spark任务,结束之后给自己发一封邮件。好吧,这是一个看起来soeasy的过程,起个crontab,写个shell脚本调用执行pyspark任务的python脚本就可以了。然而折腾了半天,才终于搞定。

        好多东西真的是你以为懂了,但其实用的时候才知道只是一知半解。

        当然,我们也没必要把什么东西都搞到精通,但是鉴于搞清楚一件事情之后再次搞不清楚同样的事情——这样的事情时常会发生,所以,允许的情况下还是要把曾经搞懂的东西记录一下比较好。

        额,废话一堆,给自己找理由,其实只是因为想半小时搞定的时候搞了几小时,心里实在不爽!打点字发泄一下!!!!不爽!当然,现在我认为搞懂的一切也都只是把零散的知识结合遇到的问题,加上我自己系统知识得到的一个认识,这个认识不一定准确,只是在此刻我能给出的最合理的解释而已。

        其实很简单,不过我好久没打过字了,说废话的感觉真爽。哈哈,进入正文:


        一、crond需要加载全局变量

        首先,crond任务是一个守护进程,OK,它不需要登录shell。所以它不会执行登录shell的一堆脚本。

        我们登录shell的时候,首先会执行profile来设置一些用户相关的全局变量(一个用户可以有多个shell,但是profile的过程是不变的),然后再根据具体的shell执行shell相关的配置比如bashrc。相关的路径,Linux的各个发行版,名字都不太一样。大概是/etc/profile, ~/.bashrc之类的

        所以crond执行任务的时候,并没有拿到这些全局变量,因此需要你在脚本里手动加载一下这些东西,不然比如你起个Spark任务,系统连JVM都找不到的~~而且连上了之后,也会经常断网connect error。

        解决方法就是执行profile文件。


        二、source, 点,点杠,sh执行的区别

        source = 点。

        点杠其实跟没有点杠是一样的,都是直接执行文件,前提是该文件是有x权限的。如果该执行文件需要被某个解释器执行,一定要在开头配好该解释器的位置#!/bin/sh之类的

        "sh 文件名"执行的是sh可执行文件,文件名是一个sh程序的一个参数,系统会在配置好的PATH中找,通常是/bin/sh。

        这里要注意:source命令有一个不一样的地方,就是它是在shell的当前进程中执行的。而其他shell命令大都默认fork一个子进程来执行子shell。

        因此source /etc/profile之后,之后在本shell中,变量就变化了。而如果sh /etc/profile,只是改变了子shell中的环境,本shell中的环境并没有改变~