Linux Bash 脚本编写第 5 部分 – 信号和作业

2023-10-25

在上一篇文章中,我们谈到了输入、输出和重定向在 bash 脚本中。今天我们将学习如何在Linux系统上运行和控制它们。到目前为止,我们只能从命令行界面运行脚本,但这并不是运行 Linux bash 脚本的唯一方法。

这篇文章描述了控制 Linux bash 脚本的不同方法。

 

 

Linux信号

这些是最常见的 Linux 系统信号:

Num Name Job
1 SIGHUP Process hangs up.
2 SIGINT Process Interruption.
3 SIGQUIT Proces quit or stop.
9 SIGKILL Process termination.
15 SIGTERM Process termination.
17 SIGSTOP Process stopping without termination.
18 SIGTSTP Process stopping or pausing without termination.
19 SIGCONT Process continuation after stopping.

您的 Linux bash 脚本不控制这些信号。您可以对 bash 脚本进行编程,以识别信号并根据发送的信号执行命令。

 

停止进程

要停止正在运行的进程,可以按 Ctrl+C,这会生成 SIGINT 信号来停止 shell 中当前运行的进程。


$ sleep 100  

Ctrl+C

暂停进程

Ctrl+Z 键生成 SIGTSTP 信号以停止 shell 中运行的任何进程,并将程序保留在内存中。


$ sleep 100  

Ctrl+Z

括号内的数字(1)是职位编号。

如果您尝试退出 shell,并且已为您的 shell 分配了已停止的作业,则 bash 会警告您。

您可以使用 ps 命令查看已停止的作业。


ps –l  

在 S 列(进程状态)中,它显示跟踪 (T) 或停止 (S) 状态。

如果您想终止已停止的作业,您可以杀死它的进程通过使用杀死命令.


kill processID  

 

陷阱信号

要捕获信号,您可以使用陷阱命令。如果脚本收到 trap 命令定义的信号,它将停止处理,转而由脚本处理该信号。

您可以使用 trap 命令捕获信号,如下所示:


#!/bin/bash
trap "echo 'Ctrl-C was trapped'" SIGINT
total=1
while [ $total -le 3 ]; do
	echo "#$total"
	sleep 2
	total=$(($total + 1))
done  

每次按 Ctrl+C 时,都会捕获信号并打印消息。

如果按 Ctrl+C,则会打印 trap 命令中指定的 echo 语句,而不是停止脚本。很酷,对吧?

 

捕获脚本退出

您可以使用 trap 命令捕获 shell 脚本退出,如下所示:


#!/bin/bash
# Add the EXIT signal to trap it
trap "echo Goodbye..." EXIT
total=1
while [ $total -le 3 ]; do
	echo "#$total"
	sleep 2
	total=$(($total + 1))
done  

当 bash 脚本退出时,会按预期打印 Goodbye 消息。

此外,如果您在完成工作之前退出脚本,则会触发 EXIT 陷阱。

 

修改或删除陷阱

您可以使用新选项重新发出 trap 命令,如下所示:


#!/bin/bash
trap "echo 'Ctrl-C is trapped.'" SIGINT
total=1
while [ $total -le 3 ]; do
	echo "Loop #$total"
	sleep 2
	total=$(($total + 1))
done
# Trap the SIGINT
trap "echo ' The trap changed'" SIGINT
total=1
while [ $total -le 3 ]; do
	echo "Second Loop #$total"
	sleep 1
	total=$(($total + 1))
done  

请注意更改信号陷阱后脚本如何管理信号。

你也可以移除陷阱通过使用两个破折号。


trap -- SIGNAL  

#!/bin/bash
trap "echo 'Ctrl-C is trapped.'" SIGINT
total=1
while [ $total -le 3 ]; do
	echo "#$total"
	sleep 1
	total=$(($total + 1))
done
trap -- SIGINT
echo "I just removed the trap"
total=1
while [ $total -le 3 ]; do
	echo "Loop #2 #$total"
	sleep 2
	total=$(($total + 1))
done  

请注意脚本在删除陷阱之前和删除陷阱之后如何处理信号。


$ ./myscript  

Crtl+C

第一个 Ctrl+C 被捕获,脚本继续运行,而第二个则退出脚本,因为陷阱已被删除。

 

在后台模式下运行 Linux Bash 脚本

如果您看到 ps 命令的输出,您将看到所有正在后台运行的进程,而不是绑定到终端。

我们也可以做同样的事情,只需在命令后面放置与符号(&)即可。


#!/bin/bash
total=1
while [ $total -le 3 ]; do
	sleep 2
	total=$(($total + 1))
done  

$ ./myscipt &  

完成此操作后,脚本将在系统上的单独后台进程中运行,您可以在方括号之间看到进程 ID。

当脚本终止时,您将在终端上看到一条消息。

请注意,当后台进程运行时,您可以使用终端监视器来查看 STDOUT 和 STDERR 消息,因此如果发生错误,您将看到错误消息和正常输出。

如果您退出终端会话,后台进程将退出。

那么如果关闭终端还想继续运行怎么办?

 

运行脚本而不会挂起

即使您使用以下命令退出终端会话,您也可以在后台进程中运行 Linux bash 脚本:nohup 命令.

nohup 命令阻止任何 SIGHUP 信号。当您退出终端时,它会阻止进程退出。


$ nohup ./myscript &  

运行 nohup 命令后,您看不到脚本的任何输出或错误。您将输出和错误消息发送到名为的文件nohup.out.

注意:从同一目录运行多个命令时将覆盖 nohup.out 文件内容。

 

查看职位

要查看当前作业,可以使用 jobs 命令。


#!/bin/bash
total=1
while [ $total -le 3 ]; do
	echo "#$count"
	sleep 5
	total=$(($total + 1))
done  

然后运行它。


$ ./myscript  

然后按 Ctrl+Z 停止脚本。

运行相同的 bash 脚本,但在后台使用 & 符号并将输出重定向到文件以进行澄清。


$ ./myscript > outfile &  

jobs 命令显示已停止和正在运行的作业。


jobs –l  

-l参数查看进程ID

 

重新启动停止的作业

您可以使用 bg 命令以后台模式重新启动作业。


$ ./myscript  

然后按 Ctrl+Z

现在已经停止了。


$ bg  

使用 bg 命令后,它现在以后台模式运行。

如果您有多个已停止的作业,您可以通过向 bg 命令指定作业编号来执行相同的操作。

您可以使用fg命令以前台模式重新启动作业。


$ fg 1  

 

安排工作

Linux系统提供了两种在预定义时间运行bash脚本的方法:

  • 在命令下。
  • 计划任务表。

at 命令

这是命令的格式

在 [-f 文件名] 时间

at 命令可以接受不同的时间格式:

  • 标准时间格式如 10:15。
  • AM/PM 指示器,如 11:15 PM。
  • 一个指定的时间,比如现在,午夜。

您可以使用一些不同的日期格式包含特定日期:

  • 标准日期格式,例如 MMDDYY 或 DD.MM.YY。
  • 文本日期,例如 6 月 10 日或 2 月 12 日,带或不带年份。
  • 现在+ 25 分钟。
  • 明天上午 05:15。
  • 11:15 + 7 天。

我们不想深入研究 at 命令,但现在,让它变得简单。


$ at -f ./myscript now  

如果系统有电子邮件,则可以使用 -M 参数将输出发送到电子邮件,如果没有,这将抑制 at 命令的输出。

要列出待处理的作业,请使用 atq 命令:

 

删除待处理的作业

要删除挂起的作业,请使用 atrm 命令:


$ atrm 18  

您必须为 atrm 命令指定作业编号。

 

调度脚本

如果您需要每天或每月左右的同一时间运行脚本怎么办?

您可以使用 crontab 命令来安排作业。

要列出计划的作业,请使用 -l 参数:


$ crontab –l  

crontab 的格式为:

分钟、小时、月份、月份和星期几

因此,如果您想每天 10:30 运行命令,请输入以下内容:

30 10 * * * 命令

通配符(*)用于指示 cron 将在每月的每天 10:30 执行该命令。

要在每周二下午 5:30 运行命令,您可以使用以下命令:

30 17 * * 2 命令

一周中的某一天从 0 到 6 开始,其中星期日=0,星期六=6。

要在每个月初的 10:00 运行命令:

00 10 1 ** 命令

该月的日期为 1 日至 31 日。

现在让我们保持简单,我们将在以后的文章中详细讨论 cron。

要编辑 cron 表,请使用 -e 参数,如下所示:


crontab –e  

然后键入如下命令:


 30 10 * * * /home/likegeeks/Desktop/myscript  

这将安排我们的脚本在每天 10:30 运行。

注意:有时,您会看到错误消息“资源暂时不可用”。

您所要做的就是:


$ rm -f /var/run/crond.pid  

您应该是 root 用户才能执行此操作。

就这么简单!

您可以使用预先配置的 cron 脚本目录之一,例如:

/etc/cron.每小时

/etc/cron.daily

/etc/cron.weekly

/etc/cron.monthly

只需将 bash 脚本文件放在任何一个目录中,它就会定期运行。

 

登录时启动脚本

~/.bashrc– 将您的脚本放在这里,每次您打开新终端时它都会运行。

〜/.xprofile– 当您登录到图形桌面环境(例如 GNOME 或 KDE)时,此处的脚本将由 X Window 系统运行。

/etc/X11/Xsession.d/– 如果您在 Linux 中使用 GUI 界面在启动时运行脚本,则可以使用此目录。

/etc/配置文件– 该文件包含全局环境变量以及应用于系统上所有用户的设置。

我希望您觉得这篇文章有用。继续回来。

谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux Bash 脚本编写第 5 部分 – 信号和作业 的相关文章

  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • 选择fasta文件中氨基酸超过300个且“C”出现至少4次的序列

    我有一个包含蛋白质序列的 fasta 文件 我想选择超过 300 个氨基酸且半胱氨酸 C 氨基酸出现超过 4 次的序列 我使用此命令来选择具有超过 300 个 aa 的序列 cat 72hDOWN fasta fasta bioawk c
  • 我想在 Red Hat Linux 服务器中执行 .ps1 powershell 脚本

    我有一个在窗口中执行的 ps1 powershell 脚本 但我的整个数据都在 Linux 服务器中 有什么可能的方法可以让我在红帽服务器中执行 powershell 脚本 powershell脚本是 Clear Host path D D
  • 如何将一个文本文件拆分为多个 *.txt 文件?

    我有一个文本文件file txt 12 MB 包含 something1 something2 something3 something4 有没有办法分开file txt分成 12 个 txt 文件 比方说file2 txt file3 t
  • 在本地主机上使用相同的 IP 和端口创建套接字

    我在 Linux 上看到奇怪的行为 我看到远程端和本地端都显示相同的 IP 和端口组合 以下是 netstat 输出 netstat anp 网络统计grep 6102 tcp 0 0 139 185 44 123 61020 0 0 0
  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • 在 scapy 中通过物理环回发送数据包

    我最近发现了 Scapy 它看起来很棒 我正在尝试查看 NIC 上物理环回模块 存根上的简单流量 但是 Scapy sniff 没有给出任何结果 我正在做的发送数据包是 payload data 10 snf sniff filter ic
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • Bash:将字符串添加到文件末尾而不换行

    如何将字符串添加到文件末尾而不换行 例如 如果我使用 gt gt 它将添加到文件末尾并换行 cat list txt yourText1 root host 37 echo yourText2 gt gt list txt root hos
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • 如何在线程创建和退出时调用函数?

    include
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下

随机推荐

  • 如何在 Python 中计算两个日期之间的天数

    在 Python 中处理日期和时间时 计算两个日期之间的天数是一项常见任务 无论您是构建预订系统 日程安排工具还是任何其他涉及日期和时间的应用程序 计算两个日期之间的天数都是一个关键功能 在本文中 我们将讨论如何在 Python 中计算两个
  • 什么是中间人 (MITM) 攻击?

    A 中间人 MITM 攻击是一种常见的网络安全威胁 如果处理不当 可能会造成严重后果 在这种类型的攻击中 恶意行为者会拦截 中继并可能改变认为彼此直接通信的两方之间的通信 本文将深入探讨 MITM 攻击带来的威胁 攻击者使用的技术以及个人和
  • 如何利用技术进步实现完美的远程办公

    远程工作并不是一个新趋势 作家 记者和艺术家总是有机会在舒适的家中工作 尽管如此 远程办公始终与技术密切相关 在过去 远程工作人员依赖邮件服务和交通 随着这两个领域变得越来越好 越来越多的人能够在家执行工作任务 然而 直到互联网的出现 这种
  • 如何在 Debian 9 上设置 Apache 虚拟主机

    在本教程中 我们将引导您了解如何在 Debian 9 上设置 Apache 虚拟主机 Apache 虚拟主机允许您在一台计算机上托管多个域 使用虚拟主机时 您可以为每个域或子域指定不同的文档根 包含网站文件的目录 创建单独的安全策略 使用不
  • 如何在 CentOS 8 上安装 R

    R 是一种开源编程语言和免费环境 专门从事统计计算和图形表示 它由 R 统计计算基金会支持 主要供统计学家和数据挖掘人员用于开发统计软件和执行数据分析 本文介绍如何在 CentOS 8 上安装 R 先决条件 在继续本教程之前 请确保您已满足
  • 如何更改 SFTP 端口

    SFTP SSH 文件传输协议 是一种安全文件协议 用于通过加密连接在两台主机之间传输文件 它还允许您对远程文件执行各种文件操作并恢复文件传输 SFTP 可用作旧版 FTP 协议的替代品 它具有 FTP 的所有功能 但连接更安全 本文介绍如
  • 如何在 Ubuntu 18.04 上设置或更改时区

    在 Ubuntu 上 系统的时区是在安装过程中设置的 但以后可以轻松更改 使用正确的时区对于许多与系统相关的任务和流程都很重要 例如 cron 守护进程使用系统的时区来执行 cron 作业 并且日志文件中的时间戳基于相同的时区 本教程演示如
  • 如何在 Debian 9 上安装 Yarn

    Yarn 是一个与 npm 兼容的 JavaScript 包管理器 它的创建是为了解决 npm 的一系列问题 例如通过并行操作加快软件包安装过程并减少与网络连接相关的错误 在本教程中 我们将指导您如何安装Yarn在 Debian 9 系统上
  • 如何在 Ubuntu 18.04 上安装 Django

    Django 是一个免费开源的高级 Python Web 框架 旨在帮助开发人员构建安全 可扩展和可维护的 Web 应用程序 有不同的方法来安装 Django 具体取决于您的需要 它可以在系统范围内安装 也可以使用 pip 安装在 Pyth
  • 如何在 Linux 中添加目录到 PATH

    当您在命令行上键入命令时 您基本上是在告诉 shell 运行具有给定名称的可执行文件 在Linux中 这些可执行程序就像ls find file和其他文件 通常位于系统上的几个不同目录中 存储在这些目录中的任何具有可执行权限的文件都可以从任
  • 如何在 CentOS 8 上设置或更改时区

    使用正确的时区对于许多与系统相关的任务和流程至关重要 例如 cron 守护进程使用系统的时区来执行 cron 作业 并且日志文件中的时间戳基于同一系统的时区 在 CentOS 上 系统的时区是在安装过程中设置的 但以后可以轻松更改 本文介绍
  • Python range() 函数

    蟒蛇rangetype 通过定义范围的起点和终点来生成整数序列 它通常与for循环迭代数字序列 range 在 Python 2 和 3 中的工作方式有所不同 在Python 2中 有两个函数可以让你生成整数序列 range and xra
  • Linux 中的正常运行时间命令

    在本教程中 我们将介绍uptime命令 顾名思义 uptime命令显示系统已经运行了多长时间 它还显示当前时间 登录用户数以及过去 1 5 和 15 分钟的系统负载平均值 如何使用正常运行时间命令 uptime 命令的语法如下 uptime
  • 如何在 CentOS 7 上使用 VSFTPD 设置 FTP 服务器

    FTP 文件传输协议 是一种标准的客户端 服务器网络协议 允许用户在远程网络之间传输文件 有多种可用于 Linux 的开源 FTP 服务器 最流行和最广泛使用的是PureFTPd ProFTPD and vsftpd 在本教程中 我们将在
  • Python while 循环

    循环是编程语言的基本概念之一 当您想要多次重复特定的代码块直到满足给定条件时 循环会很方便 Python中有两种基本的循环结构 for and while loops 本教程涵盖了以下基础知识whilePython 中的循环 我们还将向您展
  • NumPy loadtxt 教程(从文件加载数据)

    在之前的教程中 我们讨论过NumPy 数组 我们看到了它如何使读取 解析和对数字数据执行操作的过程变得轻而易举 在本教程中 我们将讨论 NumPy loadtxt 方法 该方法用于解析文本文件中的数据并将其存储在 n 维 NumPy 数组中
  • Linux Bash 脚本编写第 3 部分 – 参数和选项

    到目前为止 您已经了解了如何编写无需用户输入即可完成工作的 Linux bash 脚本 今天我们将继续我们的 Linux bash 脚本系列 如果您想了解我们在谈论什么 我建议您查看之前的帖子 Bash 脚本基础知识 Bash 脚本 For
  • Pythonnamedtuple(将元组提升到一个新的水平)

    在本教程中 我们将深入研究命名元组 它们是什么 如何创建和操作它们 以及何时使用它们 或不使用它们 命名元组是Python内置的一部分收藏模块 并且它们提供了一种将数据捆绑在一个名称下的便捷方法 它们是 Python 内置元组数据类型的子类
  • 使用 Python 处理 CSV:综合教程

    CSV 逗号分隔值 文件是存储和共享表格数据的最常见方法之一 这些文件由行和列组成 其中每行代表一个记录 列包含由分隔符 通常是逗号 分隔的值 Python 提供了多种内置方法来处理 CSV 文件 使您可以高效地读取 写入和操作数据 本教程
  • Linux Bash 脚本编写第 5 部分 – 信号和作业

    在上一篇文章中 我们谈到了输入 输出和重定向在 bash 脚本中 今天我们将学习如何在Linux系统上运行和控制它们 到目前为止 我们只能从命令行界面运行脚本 但这并不是运行 Linux bash 脚本的唯一方法 这篇文章描述了控制 Lin