[Linux Shell学习系列四]Shell命令进阶-后台执行命令


1. cron、crontab命令

cron是执行定时计划任务的守护进程。

当系统是多用户运行级别时,cron进程会从/etc/init.d中自动启动。cron进程会在目录/var/spool/cron/contabs/下搜索定时计划任务文件(定时计划任务文件以创建次任务的账户名命名),并将找到的这些定时计划任务载入内存。

注意:/var/spool/cron/contabs/中的定时计划任务文件不要用文本编辑器编辑,应当使用crontab命令访问和更新它们的内容。因为crontab命令可以检查这些文件中的语法错误。

cron进程还会读取/etc/crontab以及目录/etc/cron.d下的内容。

cron进程每分钟唤醒一次,审查所有存储的定时计划任务,检查每个命令,看它是否应该在当前时间运行。

另外,cron每分钟会检查一次它的池目录/var/spool/cront/crontabs的修改时间(modtime)是否已经改变。如果修改时间已经改变,cron会检查所有定时计划任务文件的修改时间,并重新加载那些已经被修改的定时计划任务文件。因此,当定时计划任务文件被修改后,不需要重启cron守护进程。

注意:使用crontab修改定时计划任务文件时,它会更新池目录/var/spool/cront/crontabs的修改时间。

 

crontab命令用于创建、修改、删除和查看定时计划任务。每个用户可以使用crontab命令创建自己的定时计划任务,生成的计划任务文件将以用户的账户名命名。

定时计划任务文件由每行命令组成,每行有6个字段,由空格或制表符分隔。前五个字段表示运行任务的时间,最后一个字段是任务的命令。

前五个字段的含义依次为:

  • 分钟:0~59
  • 小时:0~23
  • 日期:1~31
  • 月份:1~12或Jan~Dec
  • 星期:0~6或Sun~Sat,0表示星期日

这五个字段中还可以使用以下特殊字符描述:

  • *星号:匹配所有可能的值,如“0 6 * * *”表示每天6点
  • -连字符:定义一个范围,比如“0 2 ** 1-5”表示每周一到周五的凌晨2点
  • /斜杠:表示每间隔多少时间,如“*/5 * * * *”表示每5分钟
  • ,逗号:表示或,如“0 0,6,12,18 * * *”表示每天的0点、6点、12点和18点
$ crontab -l #使用-l选项,可以列出当前用户的所有定时计划任务,如每分钟执行一次脚本
*/1 * * * * /home/user1/test/echotime.sh

$ crontab -e #使用-e选项,创建或修改当前用户的定时计划任务

$ crontab -u user1 -l #使用-u选项,查看指定用户的定时任务计划
*/1 * * * * /home/user1/test/echotime.sh

$ crontab -r #使用-r选项,移除当前用户的定时计划任务,不经确认

$ crontab -i -r #使用-i配合-r选项,可以在移除前提示用户确认
crontab: really delete user1's crontab?

 

2. at命令

 at命令用于安排一个任务在指定的时间运行。可以从标准输入读入命令,也可以从指定的文件中读入,然后在指定的时间运行这些命令。

语法:at [-f file] [-q queue] [OPTION] TIME [DATE]

# date
# at now + 1 minutes #创建一个定时任务
at> date
at> <EOT> #这里使用Ctrl+D
job at [执行时间]

# cat myjobs.txt
/path/to/a/shell-script
/path/to/any/command

# at -f myjobs.txt now + 1 hour #使用-f参数,定时运行文件中的内容
job at [执行时间]

# at -l #使用-l参数,列出当前用户(非root)所有使用at命令创建的还未运行或正在运行的任务,如果是root用户,列出所有用户的任务
1 2013-10-07 05:00 a root

# atq #atp命令与at -l一样

# atrm 1 #通过-l列出的任务编号,删除现有的任务

注:上述命令未尝试

 

3. &控制操作符

字符“&”是Bash内置的用于并行处理进程的一个控制操作符。在命令末尾添加&会在后台运行该命令,将在当前的Shell进程下启动一个子Shell进程,因此当该命令在后台运行时,可以继续在此终端输入并运行其他命令。

语法:command &或script-name &

$ sleep 10 & #将命令放到后台执行
[1] 29281 #显示这个后台任务的编号(1)及其对应的子进程号(29281)

$ jobs #使用jobs命令,可以查看后台正在运行的任务的信息
[1]+  Running                 sleep 10 & #正在运行

$ jobs #再次使用jobs命令查看
[1]+  Done                    sleep 10 #结束

$ jobs -l #jobs命令使用-l选项,可以列出后台正在运行的任务的进程号等信息
[2]+ 32203 Running                 sleep 10 & #这里的任务编号是2 

$ %2 #使用%+通过jobs查到的任务编号,将指定的任务放到前台运行,并作为当前运行的任务
sleep 10

$ fg 2 #使用fg命令+通过jobs -l查到的任务编号,将指定的任务放到前台运行,并作为当前运行的任务
sleep 10

$ sleep 30 & #后台运行
[3] 5045

$ fg 3 #使用fg命令放到前台运行
sleep 30
^C #这里输入Ctrl+Z将任务挂起

$ bg 3 #使用bg命令将任务重新放到后台运行
[3]+ sleep 30 &

$ jobs -l
[3]   5045 Running                 sleep 30 &

 

4. nohup命令

nohup命令让你运行的命令或脚本在你退出系统后继续在后台运行。

语法:nohup COMMAND [ARG]... &

COMMAND:Shell脚本或命令的名称

[ARG]:脚本或命令的参数

&:nohup命令不能自动地将任务放在后台运行,必须明确的使用&操作符

$ nohup ./echotime.sh & #使用nohup命令运行一个脚本
[1] 5327 #这里输出任务编号(1)和后台任务的进程号(5327)
$ nohup: ignoring input and appending output to 'nohup.out' #输出一行信息,表示脚本运行输出的所有内容都被写入到当前目录下的文件nohup.out中

$ ps -ef|grep 5327 #当退出系统再重新登录后,还可以查看正在运行的脚本

 

本节结束

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM