<Linux>《SHELL脚本在crontab环境下执行失败问题处理》>> 探索SHELL运行模式和加载环境变量【实践+实验】

《SHELL脚本在crontab环境下执行失败问题处理》>> 探索SHELL运行模式和加载环境变量【实践+实验】

  • 1 现象描述
  • 2 分析
  • 3 解决方法
  • 4 深层研究
    • 4.1 shell
    • 4.2 shell脚本的环境变量
    • 4.3 shell脚本四种执行方法
    • 4.4 source 、.、./、bash 的区别
    • 4.5 shell常用的一些参数
    • 4.6 shell常见的命令
      • ① 查看当前shell
      • ② crontab 定时任务
      • ③ 2>&1 标准错误输出
      • ④ 环境变量生效
  • 5 shell 模式
    • 5.1 四种模式判定方法
    • 5.2 执行脚本
    • 5.3 环境变量

1 现象描述

在suse 10 linux环境中部署crontab脚本,用以定时重启应用进程。具体包含:使用nohup命令启动tongweb应用进程,具体命令片段为:cd /tongweb/bin;nohup ./startserver.sh >/dev/null &。该进程为root用户启动。在测试环境,无论单条命令执行,还是定时执行整个脚本,都是正常的。但是上线生产环境后,执行失败。

2 分析

进行试验,发现脚本在前台执行的时候均正常,在crontab后台执行会失败。经阅资料,发现crontab执行脚本失败的基本原因是,环境变量未加载,即/etc/profile。本质是:bash脚本登录模式默认加载/etc/profile文件,而非登录模式默认不加载/etc/profile文件。

3 解决方法

1、脚本中加载环境变量

#!/bin/bash
source /etc/profile

2、crontab前加载环境变量

0 8 * * * source /etc/profile;sh /tongweb/tongwebrestart.sh 2<&1

3、使用登录模式调用脚本

0 8 * * * /bin/bash -l /tongweb/tongwebrestart.sh 2<&1

4 深层研究

4.1 shell

Shell,区别于内核被称为壳,(Shell 脚本)是一种命令行解释器,用于与操作系统进行交互和执行命令。bash是一种shell,还有ksh等。

4.2 shell脚本的环境变量

脚本中的命令是在子shell中执行,子shell只能继承父shell的环境变量,而无法修改父shell的环境变量。

4.3 shell脚本四种执行方法

shell脚本通常以#!/bin/bash开头。

#!一般称为shebang。在Unix中,用sharp或hash(有时是mesh)称呼字符#,用bang称呼!,因而shebang代表#!

序号方法说明执行位置权限是否保存变量结果
方法1工作目录执行cd /home/test;./hello.sh子shell中执行需要执行权限不保存
方法2绝对路径执行/home/test/hello.sh子shell中执行需要执行权限不保存
方法3使用bashsh执行cd /home/test;sh hello.sh

cd /home/test;bash hello.sh
子shell中执行无需执行权限,可不写#!/bin/bash不保存
方法4使用source.执行
注意:.与脚本间有空格
cd /home/test;source hello.sh

cd /home/test;. hello.sh
在shell中直接执行无需执行权限,可不写#!/bin/bash保存

4.4 source 、.、./、bash 的区别

执行方式子shell脚本中变量是否保存是否需要执行权限
./*.sh启动新的子shell不保存变量结果需要
sh ./*.sh启动新的子shell不保存变量结果不需要
bash ./*.sh启动新的子shell不保存变量结果不需要
source ./*.sh在当前shell进程中执行脚本保存变量结果不需要
. ./*.sh在当前shell进程中执行脚本保存变量结果不需要

4.5 shell常用的一些参数

参数说明
-i如果有 -i 选项,shell 将交互地执行 ( interactive )。
-l选项使得 bash 以类似登录 shell (login shell) 的方式启动
-r如果有 -r 选项,shell 成为受限的 ( restricted )
--选项结束标志,后面的内容当做文件名或参数,即使他们以-开头
-s如果有 -s 选项,或者如果选项处理完以后,没有参数剩余,那么命令将从标准输入读取。 这个选项允许在启动一个交互 shell 时可以设置位置参数。
--login同-l
--noprofile不读取系统范围的启动文件 /etc/profile 或者任何个人初始化文件~/.bash_profile, ~/.bash_login, 或 ~/.profile 。默认情况下, bash 在作为登录 shell 启动时读取这些文件
--norc 如果 shell 是交互的,不读取/执行个人初始化文件 ~/.bashrc 这个选项在shell 以 sh 命令启动时是默认启用的
--recfile file 在交互式shell,指定初始化文件是file而不是~/.bashrc
--version版本信息

在这里插入图片描述

————————————————
本节部分内容参考CSDN博主「Code_LT」的原创文章,十分感谢,欢迎大家点击原文关注作者。原文链接:《交互式shell和非交互式shell、登录shell和非登录》
————————————————

4.6 shell常见的命令

① 查看当前shell

else@suse-linux:~> echo $SHELL
/bin/bash

② crontab 定时任务

0 8 * * * source /etc/profile;sh /tongweb/tongwebrestart.sh>/dev/null 2<&1

③ 2>&1 标准错误输出

关键字说明
1> stdout表示标准输出,默认是1
2> stderr表示标准错误
&表示等同于
2>&1表示标准错误重定向,等同于标准输出

④ 环境变量生效

source /etc/profile

5 shell 模式

根据 POSIX 标准,Shell 分为登录(login)、非登录(non-login)交互(interactive)、非交互(non- interactive)两个维度的处理。因此 bash 也不例外。

四种模式进入方式说明
登录模式(login)

su - 用户
用户名、密码登录后才能进入的shell
非登录模式(non-login)su 用户Shell 表示不需要用户名和密码,比如在登录 Shell 之后再执行的 bash,就产生了一个非登录 Shell (一些图形界面系统,有 terminal,这时,这些终端产生的一个 shell就是非登录 Shell);同时 logout 不能在非登录 Shell 中执行。
交互模式(interactive)ssh登录到对端或图形界面启动terminal终端上执行 bash(shell),shell 等待你的输入来执行实际的命令
非交互模式(non- interactive)ssh不登录直接执行命令ssh tongweb@192.168.8.130 'echo $-'
或者
crontab定时执行也是非交互式
读取脚本,从头读到尾执行结束。

5.1 四种模式判定方法

#  1、交互模式:执行命令,返回值含i为。如下:
else@suse-linux:~> echo $-
himBH#  2、非交互模式:执行命令,返回值不含i。如下:
else@suse-linux:~> ssh tongweb@192.168.8.130 'echo $-'
Password:
hBC     #也有返回值为hB# 3、登录模式:执行命令,返回值为shopt -s login_shell。如下:
else@suse-linux:~> shopt -p login_shell
shopt -s login_shell# 4、非登录模式:执行命令,返回值为shopt -u login_shell。如下:
else@suse-linux:~> shopt -p login_shell
shopt -u login_shell

5.2 执行脚本

# 1、在登陆模式下执行
/bin/bash -l script.sh
# 2、在交互模式下执行
/bin/bash -i script.sh

5.3 环境变量

登陆方式环境变量
bash 是作为交互的登录 shell 启动的,或者是一个非交互的 shell 但是指定了 --login 选项首先读取并执行 /etc/profile 中的命令,只要那个文件存在。 读取那个文件之后,它以如下的顺序查找 ~/.bash_pro‐ file, ~/.bash_login, 和 ~/.profile, 从存在并且可读的第一个文件中读取并执行其中的命令。 --noprofile 选项可以用来在 shell 启动时阻止它这样做。
shell 退出时bash 读取并执行文件 ~/.bash_logout 中的命令,只要它存在。
一个交互的 shell 但不是登录 shell 启动时bash 从文件 ~/.bashrc 中读取并执行命令,只要它存在。可以用 --norc 选项来阻止它这样做。 --rcfile file 选项将强制 bash 读取并执行文件 file 中的命令,而不是 ~/.bashrc 中的
bash 以非交互的方式启动时例如在运行一个 shell 脚本时在环境中查找变量 BASH_ENV ,如果它存在则将它的值展开,使用展开的值作为一个文件的名称,读取并执行。Bash 运作的过程就如同执行了下列命令: if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi 但是没有使用 PATH 变量的值来搜索那个文件名。
bash 以名称 sh 启动它试图模仿 (mimic) sh 历史版本的启动过程,尽可能地相似,同时也遵循 POSIX 标准。
1、当作为交互式登录 shell 启动时,或者是非交互但使用了 --login 选项启动的时候,它首先尝试读取并执行文件 /etc/profile 和 ~/.profile, 中的命令. 选项 --noprofile 用于避免这种行为
2、当使用命令 sh 来启动一个交互式的 shell 时, bash 查找环境变量 ENV, 如果有定义的话就扩展它的值,然后使用扩展后的值作为要读取和执行的文件 的名称.由于使用 sh 启动的 shell 不会读取和执行任何其他的启动文件,选项 --rcfile 没有意义.使用名称 sh 启动的非交互的 shell 不会读取任何其他启动文件.
3、当以 sh 启动时, bash 在读取启动文件之后进入 posix 模式.
bash 以 posix 模式启动时,(和使用 --posix 命令行参数效果相同)遵循 POSIX 标准. 这种模式下,交互式 shell 扩展 ENV 环境变量的值,读取并执行以扩展后值为文件名的配置文件. 不会读取其他文件.Bash 试着检测它是不是由远程 shell 守护程序,通常为 rshd 启动的.如果 bash 发现它是由 rshd 启动的,它将读取并执行 ~/.bashrc 文件中的命令, 只要这个文件存在并且可读.如果以 sh 命令启动,它不会这样做. 选项 --norc 可以用来阻止这种行为,选项 --rcfile 用来强制读取另一个文件,但是通常rshd 不会允许它们, 或者用它们来启动 shell.
shell 是以与真实用户(组) id 不同的有效用户(组) id 来启动并且没有 - 选项不会读取启动文件, 也不会从环境中继承 shell 函数. 环境变量中如果出现 SHELLOPTS, 它将被忽略.有效用户 id 将设置为真实用户 id. 如果启动时给出了 - 选项,那么启动时的行为是类似的, 但是不会重置有效用户 id.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/91856.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Git】在idea中多分支开发如何——合并分支、处理冲突

博主简介&#xff1a;22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a;是瑶瑶子啦每日一言&#x1f33c;: “人间总有一两风&#xff0c;填我十万八千梦” 目录 一、背景二、具体操作 一、背景 我当前开发的分支——hfy我想将subject分支的最新代码拉取&…

PID 算法

1.1 概述 比例&#xff08;Proportion&#xff09;积分&#xff08;Integral&#xff09;微分&#xff08;Differential&#xff09;控制器&#xff08;PID控制器或三项控制器&#xff09;是一种采用反馈的控制回路机制&#xff0c;广泛应用于工业控制系统和需要连续调制控制的…

说说Flink on yarn的启动流程

分析&回答 核心流程 FlinkYarnSessionCli 启动的过程中首先会检查Yarn上有没有足够的资源去启动所需要的container&#xff0c;如果有&#xff0c;则上传一些flink的jar和配置文件到HDFS&#xff0c;这里主要是启动AM进程和TaskManager进程的相关依赖jar包和配置文件。接着…

基于JAVAEE技术的ssm校园车辆管理系统源码和论文

基于JAVAEE技术的ssm校园车辆管理系统源码和论文105 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 1.选题背景和意义 背景&#xff1a; 随着第二次工业革命后&#xff0c;内燃机的发明与完善&#xff0c;解…

有时间窗车辆路径问题(vehicle routing problems with time windows,VRPTW)学习实践与base案例代码开发

有时间窗车辆路径问题&#xff08;Vehicle Routing Problems with Time Windows&#xff0c;VRPTW&#xff09;是一类著名的组合优化问题&#xff0c;涉及在有限时间窗口约束下&#xff0c;有效地安排多个车辆的路径&#xff0c;以满足客户需求。 在VRPTW中&#xff0c;假设有…

Flink CDC学习笔记

第一章 CDC简介 1.1 什么是CDC ​ CDC (Change Data Capture 变更数据获取&#xff09;的简称。核心思想就是&#xff0c;检测并获取数据库的变动&#xff08;增删查改&#xff09;&#xff0c;将这些变更按发生的顺序记录下来&#xff0c;写入到消息中间件以供其它服务进行订…

WordPress主题Zing V2.2.1/模块化WordPress响应式通用企业商城主题

WordPress主题Zing V2.2.1&#xff0c;模块化WordPress响应式通用企业商城主题。 功能介绍 百度熊掌号文章实时推送、原创保护 多设备支持自适应布局&#xff0c;支持电脑、Pad、手机以及各种浏览器 SEO优化首页、文章、页面、分类均支持自定义标题、关键字和描述 速度优化…

【跟小嘉学 Rust 编程】二十三、Cargo 使用指南

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…

投票同款特效样式

先看效果&#xff1a; 再看代码&#xff08;查看更多&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>import url("https://fonts.…

C#,数值计算——Midinf的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Midinf : Midpnt { public new double func(double x) { return funk.funk(1.0 / x) / (x * x); } public Midinf(UniVarRealValueFun funcc, double aa,…

为什么聊天头像ChatGPT是橙色的?

目录 ChatGPT的不同版本及其颜色 了解绿色和橙色的ChatGPT徽标 颜色变化的重要性 橙色标志的原因 故障排除和常见问题解答 常见问题3&#xff1a;如何查看ChatGPT的服务器状态&#xff1f; 常见问题4&#xff1a;如果使用ChatGPT时遇到错误&#xff0c;我该怎么办&#…

关于CICD流水线的前端项目运行错误,npm项目环境配置时出现报错:Not Found - GET https://registry.npm...

关于CICD流水线的前端项目运行错误&#xff0c;npm项目环境配置时出现报错&#xff1a;Not Found - GET https://registry.npm… 原因应该是某些jar包缓存中没有需要改变镜像将包拉下来 npm config set registry http://registry.npm.taobao.org npm install npm run build