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

news2024/12/23 18:07:26

《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.coloradmin.cn/o/957417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Netty源码NioEventLoop解析

带着问题源码 Netty 的 NioEventLoop 是如何实现的&#xff1f;它为什么能够保证 Channel 的操作是线程安全的&#xff1f;Netty 如何解决 JDK epoll 空轮询 Bug&#xff1f;NioEventLoop 是如何实现无锁化的&#xff1f; 一、作用与设计原理 Netty的NioEventLoop并不是一个存…

基于Spring Boot的住院病人管理系统设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的住院病人管理系统设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spring…

JavaScript基础04

JavaScript 基础 文章目录 JavaScript 基础函数声明和调用声明&#xff08;定义&#xff09;调用 参数形参和实参 返回值作用域全局作用域局部作用域 匿名函数函数表达式立即执行函数 理解封装的意义&#xff0c;能够通过函数的声明实现逻辑的封装&#xff0c;知道对象数据类型…

大数据项目实战(安装Hive)

一&#xff0c;搭建大数据集群环境 1.3 安装Hive 1.3.1 Hive的安装 1.安装MySQL服务 1&#xff09;检查是否安装MySQL&#xff0c;如安装将其卸载。卸载命令 rpm -qa | grep mysql 2&#xff09;搜索MySQL文件夹&#xff0c;如存在则删除 find / -name mysql rm -rf /etc/s…

低代码赋能| 绿色智慧矿山解决方案

在世界能源日趋紧张的背景下&#xff0c;能源产业的数字化升级是大势所趋。矿山行业作为国家能源安全的“压舱石”&#xff0c;也必须进行产业升级。一直以来&#xff0c;国家都在大力推动智慧矿山建设。通过大数据、GIS、物联网、云计算、人工智能等新兴技术&#xff0c;实现矿…

Leetcode 461.汉明距离

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 示例 1&#xff1a; 输入&#xff1a;x 1, y 4 输出&#xff1a;2 解释&#xff1a; 1 (0 0 0 1) 4 (0 1 0 0)↑ ↑ 上面的…

Mysql redolog

一、redolog 是啥 数据库的ACID&#xff1a;A原子性&#xff0c;C一致性&#xff0c;I隔离性&#xff0c;D持久性&#xff1b; redolog&#xff1a;保证 持久性&#xff1b; redolog: 系统奔溃重启时需要按照上述内容所记录的步骤重新更新数据页&#xff0c;特点&#xff1a…

微服务架构七种模式

微服务架构七种模式 目录概述需求&#xff1a; 设计思路实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive.…

软件架构设计(三) B/S架构风格-层次架构(一)

层次架构风格从之前的两层C/S到三层C/S,然后演化为三层B/S架构,三层B/S架构之后仍然在往后面演化,我们来看一下层次架构演化过程中都有了哪些演化的架构风格呢? 而我们先简单了解一下之前的层次架构风格中分层的各个层次的作用。 表现层:由于用户进行交互,比如MVC,MVP,…

iOS脱壳之frida-ios-dump

frida-ios-dump介绍 该工具基于frida提供的强大功能通过注入js实现内存dump然后通过python自动拷贝到电脑生成ipa文件&#xff0c;适合现iOS11版本之后的越狱手机使用。 下载 https://github.com/AloneMonkey/frida-ios-dump环境安装 电脑环境安装 win和Mac 环境一样都是…

Metinfo6.0.0任意文件读取漏洞复现

漏洞原理 在\MetInfo6.0.0\app\system\include\module\的old_thumb.class.php文件 可以看到这里对./进行了严格的过滤&#xff0c;但是却忽略了在Windows下还可以用…\来跳转目录 环境搭建 下载Metinfo6.0.0 配置随便写&#xff0c;自己记住就行 这里前面已经审计过代码了&a…

linux离线环境安装redis

先检查gcc版本&#xff0c;使用gcc --version进行检查&#xff0c;版本在5以下的&#xff0c;安装redis要安装redis6以下的版本 如果没有gcc命令&#xff0c;要先安装gcc命令。因为是离线环境&#xff0c;yum命令什么的用不了。为了安装gcc&#xff0c;进行了几种尝试。 1、下…

Java设计模式:四、行为型模式-06:观察者模式

文章目录 一、定义&#xff1a;观察者模式二、模拟场景&#xff1a;观察者模式2.1 观察者模式2.2 引入依赖2.3 工程结构2.4 模拟摇号2.4.1 摇号服务接口2.4.2 摇号返回结果类 三、违背方案&#xff1a;观察者模式3.0 引入依赖3.1 工程结构3.2 添加摇号接口和实现3.2.1 摇号服务…

Nuxt 菜鸟入门学习笔记五:CSS 样式

文章目录 本地样式表在组件内导入通过 Nuxt 配置 CSS 属性导入使用字体导入通过 NPM 发布的样式表 外部样式表动态添加样式表【高级】使用 Nitro 插件修改渲染的头部 使用预处理器单文件组件 SFC 样式类和样式绑定使用 v-bind 的动态样式Scoped StylesCSS Modules预处理器支持 …

vue3中axios的使用方法

在Vue 3中使用axios发送HTTP请求的方法与Vue 2中基本相同。首先&#xff0c;需要安装axios库&#xff1a; npm install axios然后&#xff0c;在Vue组件中引入axios&#xff1a; import axios from axios;接下来&#xff0c;可以在Vue组件的方法中使用axios发送HTTP请求。例如…

基于金豺算法优化的BP神经网络(预测应用) - 附代码

基于金豺算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于金豺算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.金豺优化BP神经网络2.1 BP神经网络参数设置2.2 金豺算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

USRP 简介,对于NI软件无线电你所需要了解的一切

什么是 USRP 通用软件无线电外设( USRP ) 是由 Ettus Research 及其母公司National Instruments设计和销售的一系列软件定义无线电。USRP 产品系列由Matt Ettus领导的团队开发&#xff0c;被研究实验室、大学和业余爱好者广泛使用。 大多数 USRP 通过以太网线连接到主机&…

创建聊天机器人:产品专属ChatGPT智能问答机器人,可添加任意网站

ChatGPT智能问答机器人可以广泛应用于各种SaaS产品&#xff0c;通过创建聊天机器人可以快速反馈用户&#xff0c;并且针对性的提供解决方案&#xff0c;非常高效的完成客户问答反馈。 聊天机器人是生活中常见的一种交互方式&#xff0c;机器人根据用户输入的关键字&#xff0c;…

怎么提取视频中的音乐保存到本地?其实方法很简单

当你想要使用视频中的音乐时&#xff0c;你可以考虑将它从视频中提取出来。这可以用于制作音频样本集&#xff0c;制作铃声或其他音频素材&#xff0c;或者向其他人展示视频的音乐部分而无需显示视频本身。如果你是一位音乐制作人员&#xff0c;你可能会需要一些特定类型的音效…

监听页面异常 + 监听页面跳转 +监听页面销毁 :监听并记录当前页面停留的时间

首先描述一下应用场景&#xff1a;播放视频&#xff0c;记录观看时长&#xff08;移动端左划动&#xff0c;右滑动&#xff0c;页面跳转&#xff0c;页面销毁[页面销毁主要是指使用中控台直接销毁]&#xff09; 说一下我的思路&#xff1a; 1.长链接 : 使用websocket来实现&…