Linux – 后台执行命令
我们在用手机看电影的时候,有时候经常会被短信或者APP更新弹出的窗口干扰在Linux上也一样,当你在终端或者控制台工作的时候,不希望在自己做事的时候,被突然的作业占住屏幕。或者有一些密集访问磁盘的进程,希望可以在非复核高峰时间段运行。这时候,我们就希望这些进程能够在后台运行。
在这种情况下,我们有几种选择:
cron : 系统调度进程。可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段运行。
at : at命令。使用它在一个特定的时间运行一些特殊的作业,或在晚一些的非负荷高峰时间段或高峰负荷时间段运行。
& : 使用它在后台运行一个占用时间不长的进程。
nohup : 使用它在后台运行一个命令,即使在用户退出时也不受影响。
cron 和 crontab
cron 是系统主要的调度进程,可以在无需人工干预的情况下运行作业。crontab允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab文件来保存调度信息。可以使用它运行任意一个shell脚本或某个命令,每小时运行一次,或一周三次,这都可以定制。但是在一个较大的系统中,系统管理员一般都会禁止这些文件,只在整个系统保留一个这样的文件。这些是通过cron.deny和cron.allow这两个文件来禁止或者允许用户拥有自己的crontab文件。
/etc/cron.allow : 将可以使用crontab的账号写入其中,若不在这个文件内的使用者则不可使用crontab
/etc/cron.deny : 将不可以使用crontab的账号写入其中,若未记录到这个文件中的使用者,就可以使用crontab
crontab [-u username] [-l|-e|-r]
-u:只有root才能进行这个任务,帮其他使用者创建/删除crontab
-e:编辑crontab的工作内容
-l:查询crontab的工作内容
-r:移除crontab的工作内容
当进入crontab的编辑,就会进入vi的编辑画面,然后一个工作一行来编辑,编辑完成之后,用[:wq]来保存并退出vi。每项工作的格式为[分钟小时 日期 月份 周 要运行的命令]
注意:当表示周的时候,0|7都代表星期天,还有一些辅助的字段:
当使用crontab运行shell脚本时,要由用户来给出脚本的绝对路径,设置相应的环境变量。不要预先设定cron知道所需要的特殊环境,用户要保证在shell脚本中提供所有必要的路径和环境变量。
如果不小心误删了crontab文件,可以在自己的$HOME路径下找一下,备份文件一般会保存在该路径下。
at命令
at命令运行用户向cron提交作业,使其在稍后的实际运行。这里稍后的实际可能是10分钟,也可能是几天。
一旦一个作业被提交,at命令会保留当前所有的环境变量,包括路径,不像crontab,只提供缺省的环境。
和crontab一样,root可以通过/etc/at.allow和/etc/at.deny来控制哪些用户可以使用at命令,对这两个文件来说,at的工作情况如下:
1. 先寻找/etc/at.allow这个文件,写在这个文件中的使用者才能使用at,没有写在这个文件中的使用者不能使用at(即便不写在at.deny中)
2. 如果没有/etc/at.allow就寻找/etc/at.deny这个文件,若写在这个at.deny的使用者则不能使用at,没有在这个at.deny文件中的使用者,就可以使用at(前提是at.allow这个文件不存在)
3. 如果两个文件都不存在,则之后root可以使用at
以上,其实我们在系统预设都可以使用at这个前提下,只需要有一个at.deny文件就能进行权限控制。
at 的基本语法:
at [-f script] [-m|-l|-r] [time] [date]
-f script : 要提交的脚本或命令。
-l : 列出当前所有等待运行的作业。
-r : 清除作业。需要提供相应的作业标识(ID)。
-m : 作业完成后给业务发邮件。
-time : at命令的时间格式很灵活;可以是H、HH.HHMM、HH:MM或H:M,甚至还能使用a.m.或p.m.。
date : 日期格式可以是月份数或日期数,at命令还能识别诸如today,tomorrow这样的值。
在这里,还是建议最好使用绝对路径来下达指令,不会出问题。
&命令
当需要将某一个命令在后台执行,我们可以使用命令 &的形式将其放到后台执行。
比如:command > out.file 2>&1 &
所有标准输出和错误输出都会被重定向到一个out.file的文件中,当你提交之后,就会显示出一个进程号,可以用它来监控该进程,或者杀死它。
nohup命令
如果你在运行一个进程,但是在你退出账户时该进程还不会结束,那么可以使用nohup(no hang up)命令。该命令可以在你退出账户知乎继续运行相应的进程。
这个命令的一般形式为:
nohup command &
例如:nohup command > myout.file 2 > &1
nohup中可以使用管道符号,所以可以一次提交多个命令,当然也可以将多个命令写入一个shell脚本,用nohup命令来执行它。
以上的命令都可以使系统管理任务变得很轻松。
最后还有一个好用的工具screen,这个可以参考一下之前的转载Linux:用Screen管理你的远程会话