linux shell:crontab,at,nohup 命令

本文介绍了Linux环境下定时任务的管理方法,包括使用crontab、at命令、后台运行(&)及nohup命令等进行作业调度的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要的事情要
做.因此有几种选择方法可供使用:
设置crontab文件,并用它来提交作业
使用at命令来提交作业
在后台提交作业
使用nohup命令提交作业
名词解释:
cron:系统调用进程,可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段
运行.
at:at命令.使用它在一个特定的时间运行一些特殊的作业,或在晚一些的非负荷高峰时间段或高峰负
荷时间段运行.
&:使用它在后台运行一个占用时间不长的进程.
nohup:使用它在后台运行一个命令,即使在用户退出时也不受影响.
1.cron和crontab
    cron是系统主要的调度进程,可以在无需人工干预的情况下运行作业.有一个叫做crontab的命令
允许用户提交,编辑或删除相应的作业.每一个用户都可以用一个crontab文件来保存调度信息.可以使
用它运行任意一个shell脚本或命令,每小时运行一次,或一周三次.每一个用户都可以有自己的
crontab文件,但在一个较大的系统中,系统管理员一般会禁止这些文件,而只在整个系统保留一个这样
的文件,系统管理员是通过cron.deny和cron.allow这两个文件来禁止或允许用户拥有自己的crontab
文件.
1.1 crontab的域
    为了能够在特定的时间运行作业,需要了解crontab文件每个条目中各个域的意义和格式:
    第1列: 分钟 1-59
    第2列: 小时 1-23
    第3列: 日   1-31
    第4列: 月   1-12
    第5列: 星期 0-6 (0表示星期天)
    第6列: 要运行的命令
    下面是crontab的格式:
    分<>时<>日<>月<>星期<>要运行的命令
    crontab文件的一个条目是从左边读起的,第一列是分,最后一列是要运行的命令,它位于星期的后
面.
    在这些域中,可以用横杠-来表示一个时间范围,例如希望星期一至星期五运行某个作业,那么可以
在星期域使用1-5来表示,还可以在这些域中使用逗号",",例如希望星期一和星期四运行某个作业,只
需要使用1,4来表示.可以用星号*来表示连续的时间段,如果对某个表示时间的域没有特别的限定,也
应该在该域中填入*.该文件的每一个条目必须含有5个时间域,而且每个域之间要用空格分隔.该文件
中所有的注释行要在行首用#来表示.
1.2 crontab条目举例
    30 21 * * * /apps/bin/cleanup.sh
    表示每天晚上21:30运行/apps/bin/cleanup.sh这个文件
    45 4 1,10,22 * * /apps/bin/backup.sh
    表示每月1,10,22日的4:45分运行/apps/bin/backup.sh这个文件
    10 1 * * 6,0 /bin/find -name "core" -exec rm {} /;
    表示每周六,日的1:10运行一个find命令并删除core文件.
    0,30 18-23 * * * /apps/bin/dbcheck.sh
    表示每天18:00至23:00之间每隔30分钟运行/apps/bin/dbcheck.sh这个文件
    0 23 * * 6 /apps/bin/qtrend.sh
    表示每周六的23:00运行/apps/bin/qtrend.sh这个文件
1.3 crontab命令选项
    crontab命令的一般形式为:
    crontab [-u user] -e -l -r
    -u 用户名
    -e 编辑crontab文件
    -l 列出crontab文件中的内容
    -r 删除crontab文件
    如果使用自己的名字登录,就不用使用-u选项,因为在执行crontab命令时,该命令能够知道当前用
户.
1.4 创建一个新的crontab文件
    在考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量
EDITOR.cron进程根据它来确定使用哪个编辑器编辑crontab文件.
    创建一个davecron文件,在该文件中加入如下的内容
    0,15,30,45 18-06 * * * /bin/echo `date` >> /root/tanjun
    保存并退出.然后再运行
    crontab davecron
    现在该文件已经提交给cron进程,它将每隔15分钟运行一次.
    同时,新创建文件一个副本已经被放在/var/spool/cron/目录中,文件名就是用户名.
1.5 列出crontab文件
    为了列出crontab文件,可以用:
    crontab -l
1.6 编辑crontab文件
    如果希望添加,删除或编辑crontab文件中的条目,而EDITOR环境变量又设置为vi,那么就可以使用
vi来编辑crontab文件,相应的命令为:
    crontab -e
    可以像使用vi编辑其它任何文件那样修改crontab文件并退出.
1.7 删除crontab文件
    crontab -r

2.at命令
    at命令允许用户向cron守护进程提交作业,使其在稍后的时间运行.一旦一个作业被提交,at命令
将会保留所有当前的环境变量,包括路径.该作业的所有输出都将以电子邮件的形式发送给用户,除非
对其输出进行了重定向,绝大多数情况下是重定向到某个文件中.
    和crontab一样,根用户可以通过/etc/目录下的at.allow和at.deney文件来控制哪些用户可以使
用at命令,哪些用户不行.
    at命令的基本形式为:
    at [-f script] [-m -l -r] [time] [date]
    -f script 是所要提交的脚本或命令
    -l 列出当前所有等待运行的作业, atq命令具有相同的作用
    -r 清除作业,为了清除某个作业,还要提供相应的作业标识(ID)
    -m 作业完成后给用户发邮件
    time at命令的时间格式非常灵活,可以是H,HH.HHMM,HH:MM或H:M,其中H和M分别是小时和分钟,还
可以使用a.m和p.m
    date 日期格式可以是月份或日期数,而且at命令还能够识别诸如today,tomorrow这样的词
2.1 使用at命令提交命令或脚本
    使用at命令提交作业有几种不同的形式,可以通过命令行方式,也可以使用at命令提示符.一般来
说在提交若干行的系统命令时,使用at命令提示符方式,而在提交shell脚本时,使用命令行方式.
    如果想提交若干行命令,可以在at命令后面跟上日期/时间并回车.然后就进行了at命令提示符,这
时只需要逐条输入相应的命令,然后按<ctrl+d>退出.
    at 21:10
    at> find / -name "passwd" -print
    at> EOF
    其中EOF就是<CTRL+D>,在21:10系统将执行一个简单的find命令
    如果希望向at命令提交一个shell脚本,使用其命令行方式即可.在提交脚本时使用-f选项.
    at 3.00pm tomorrow -f /apps/bin/db_table.sh
    该命令将在明天下午3:00运行.
2.2 列出所提交的作业
    一个作业被提交后,可以使用at -l命令来列出所有的作业
2.3 清除一个作业
    清除作业的命令格式为:
    atrm [job no] 或 at -r [job no]
    如:
    atrm job 3
3.&命令
    当在前台运行某个作业时,终端被该作业占据,而在后台运行作业时,它不会占据终端.可以使用&
命令把作业放到后台执行.
    该命令的一般形式为:
    命令 &
3.1 杀死后台进程
    如果想杀死后台进程可以使用kill命令.
4.nohup命令
    如果正在运行一个进程,而且觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令,该命
令可以在你退出帐户之后继续运行相应的进程.nohup就是不挂起的意思.
    该命令的一般形式为:
    nohup command &
4.1 使用nohup命令提交作业
    如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为

nohup.out的文件中,除非另外指定了输出文件.
    nohup command > myout.file 2>&1
    输出被重定向到myout.file文件中.

<think>好的,用户想了解关于在Linux中使用nohup启动程序并将输出重定向到/dev/null的情况。我需要先回忆一下nohup的基本用法和它的作用。nohup主要用于让命令在用户退出登录后继续运行,忽略挂断信号。通常,默认情况下nohup会把输出重定向到当前目录的nohup.out文件中,但用户可能不希望保留这些输出,所以会重定向到/dev/null,也就是丢弃输出。 接下来,用户提到的命令结构应该是nohup command >/dev/null 2>&1 &这样的形式。需要解释每个部分的作用。首先是nohup,然后是命令,接着将标准输出重定向到/dev/null,再把标准错误合并到标准输出,最后的&表示在后台运行。 需要区分标准输出和标准错误,以及重定向符号的使用。用户可能对2>&1不太理解,需要解释文件描述符1和2分别代表什么。同时,说明>/dev/null的作用是丢弃输出,避免生成nohup.out文件。 用户可能的场景是在后台运行一个不需要交互的程序,比如服务器应用或者长时间运行的脚本,并且不希望保留任何日志。这时候使用nohup配合输出重定向就很合适。 还要提醒用户,这样做之后,所有输出都会被丢弃,所以如果之后需要查看日志,这种方法就不适用了。另外,虽然nohup可以防止进程因为终端关闭而终止,但如果是其他原因导致进程结束,比如程序自身错误,nohup也无法保持进程运行。 最后,给出一个具体的例子,比如启动一个Python脚本,并解释命令的各个部分。确保用户能够理解每个符号和参数的意义,以及整个命令的效果。</think>在Linux系统中,使用`nohup`命令结合`>/dev/null`是一种常见的后台运行程序并丢弃输出的方法。以下是分步说明: --- ### **1. 基础命令结构** ```bash nohup your_command > /dev/null 2>&1 & ``` - **关键组件解析:** - `nohup`:忽略`SIGHUP`信号(终端断开时触发的挂起信号),确保进程在终端关闭后仍运行。 - `>/dev/null`:将标准输出(`stdout`,文件描述符1)重定向到空设备文件(丢弃输出)。 - `2>&1`:将标准错误(`stderr`,文件描述符2)合并到标准输出(即一同丢弃)。 - `&`:将命令置于后台运行。 --- ### **2. 各部分的作用** 1. **`nohup`的作用** - 默认情况下,终端退出时会向所有关联的进程发送`SIGHUP`信号,导致进程终止。 - `nohup`会捕获并忽略`SIGHUP`信号,使程序持续运行。 2. **`>/dev/null`的作用** - `nohup`默认会将输出保存到当前目录的`nohup.out`文件。 - 通过`>/dev/null`将标准输出丢弃(`/dev/null`是Linux的“黑洞”设备)。 3. **`2>&1`的必要性** - 单独使用`>`只会重定向标准输出(文件描述符1),但程序的错误输出(`stderr`,文件描述符2)仍可能打印到终端。 - `2>&1`将标准错误合并到标准输出,确保错误信息也被丢弃。 --- ### **3. 典型使用场景** - **后台运行无需交互的脚本**(如数据备份、定时任务)。 - **避免生成日志文件**(尤其对磁盘空间敏感的环境)。 - **SSH远程执行命令后断开连接**,仍需保持程序运行。 --- ### **4. 示例与变体** ```bash # 启动Python脚本并丢弃所有输出 nohup python3 my_script.py > /dev/null 2>&1 & # 仅丢弃标准输出,保留错误日志(不推荐) nohup your_command > /dev/null 2> error.log & ``` --- ### **5. 注意事项** - **无法完全避免进程终止**:`nohup`仅处理终端断开的信号,程序自身错误(如段错误)仍会退出。 - **调试阶段慎用**:丢弃输出后无法查看程序运行状态,建议调试时保留日志。 - **替代工具**:复杂场景可使用`screen`或`tmux`管理会话。 --- 通过这种方式,你可以安全地在后台运行程序,同时避免输出信息干扰或占用存储空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值