检测自上次在Linux上的shell脚本运行后重新启动?

从上次脚本运行以来,如果主机已经重新启动,从shell脚本告诉的最好方法是什么? 我可以考虑在每次运行时将运行时间存储在一个文件中,并检查它是否已经减less,但看起来并不完全稳定(服务器可能会重启,启动速度很慢,运行时间很短,然后重新启动缓慢,更高的运行时间)。

有没有像“开始”价值,这将保证只有在重新启动才能改变? 或者其他一些检测重启的好方法?

    如果你不想使用cron,你也可以在/dev/shm创build一个目录。 由于该位置在内存中,所以在计算机启动时它将一直是空的。 如果它不是空的,你没有重新启动。

    • 系统启动时在某处创build一个目录。
    • 当脚本运行时,如果目录存在,则系统已经重新启动,否则不会。
    • 让你的脚本删除目录。

    在/ etc / crontab中使用@reboot指令来在系统启动时创build目录。

    另一种方法是在启动脚本的某处触摸某个文件,然后在脚本中search该文件,脚本可以在第一次运行时删除它。

    只要小心处理运行时级别的变化等等。

    sar命令会帮助你。

    http://linux.die.net/man/1/sar

    sysinfo ()OS调用为您提供自上次重新启动以来的时间。 这是执行某些格式化之前正常运行时间获取数据的地方 – 比parsing正常运行时间的输出/计算如何读取init(pid 1)的开始时间更容易编写自己的包装器。

     #include <stdio.h> #include <time.h> #include <errno.h> int main(int argc, char **argv) { struct sysinfo info; int status; status=sysinfo(&info); if (status==0) { printf("%d\n", info.uptime); } else { fprintf(STDERR,"error %d occurred\n", errno); } exit (status); } 

    您还需要触摸脚本中的文件并轮询其mtime(使用脚本中的stat(1)或C中的stat(2) )

     #!/bin/bash # # usage: $(basename $0) FILE # returns TRUE if the file has been run since last boot # [[ $# -ne 1 ]] && { grep 'usage' "$0"; exit 255; } # access time of script/program atime="$(stat -c %X "$1")" # Last boot as unix timestamp btime="$(date -d "$(who -b | awk '{ print $3, $4 }')" +%s)" if [[ $atime -gt $btime ]]; then exit 0 # true else exit 1 # false fi 

    这实际上会让你在那里,这将检查自上次启动以来是否访问过一个文件。

     #!/bin/bash unixTimestamp () { date --utc --date "$1" +%s } if [ "$1" == "" ];then echo "You must specify a filename (eg './lastRun.sh foobar.sh')" exit 255 fi FILENAME=$1 if [ -f ${FILENAME} ]; then if [ -n ${FILENAME} ]; then LASTRUN=`ls -laru ${FILENAME}|cut -f6,7,8 -d' '|sed 's/'${FILENAME}'//g'|sed 's/^ *//;s/ *$//'` LASTBOOT=`who -b|sed 's/.*system boot//g'|sed 's/^ *//;s/ *$//'` echo "Last Run: '${LASTRUN}'" echo "Last Boot: '${LASTBOOT}'" if [ "$(unixTimestamp ${LASTRUN})" -lt "$(unixTimestamp ${LASTBOOT})" ]; then echo "${FILENAME} has not been run since last boot." exit 1 else echo "${FILENAME} has been run since last boot" exit 0 fi fi else echo "Unable to find file '${FILENAME}'..." exit 255 fi 

    如果你已经运行了文件,它将被访问,但它也可能已经被某人编辑,不能运行,或者被触摸。

    编辑

    一点解释:

    LASTRUN = ls -laru ${FILENAME}|cut -f6,7,8 -d' '|sed 's/'${FILENAME}'//g'|sed 's/^ *//;s/ *$//'

    对于上面的命令:

     ls -laru ${FILENAME}|cut -f6,7,8 -d' ' # Will take the filename and display the last access time |sed 's/'${FILENAME}'//g' # Will strip the filename out to leave you with the date and time |sed 's/^ *//;s/ *$//' # Will strip out whitespace before and after the date/time 

    这会给你一个date/时间,准备转换成一个unix时间戳

    LASTBOOT = who -b|sed 's/.*system boot//g'|sed 's/^ *//;s/ *$//'

    对于上面的命令:

     who -b # Will show the time the system last booted |sed 's/.*system boot//g' # Will strip out the text "system boot" to leave you with a date/time |sed 's/^ *//;s/ *$//' # Will strip out whitespace before and after the date/time 

    这会给你一个date/时间,准备转换成一个unix时间戳

    unixTimestamp函数使用Date / TIMEvariables并将其转换为unix时间戳,然后只是查看哪个数字较大。 更高的数字是最近的,所以我们可以计算出最后发生的事情是重新启动还是文件访问。