在上一篇文章中,我们谈到了输入、输出和重定向在 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/配置文件– 该文件包含全局环境变量以及应用于系统上所有用户的设置。
我希望您觉得这篇文章有用。继续回来。
谢谢。