命令(14个)

bg,fg,jobs,kill,killall,pkill,crontab,pstree,nice/renice,nohup,runlevel,service,at

&

16.1.(bg,fg,job)

功能:

A,Shell支持作用控制,有以下命令:

1. command& 让进程在后台运行

2. jobs 查看后台运行的进程

3. fg %n 让后台运行的进程n到前台来

4. bg %n 让进程n到后台去; 

PS:"n"为jobs查看到的进程编号.

 

总结:
fg、bg、jobs、&、ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的
一。& 最经常被用到
这个用在一个命令的最后,可以把这个命令放到后台执行
二。ctrl + z
可以将一个正在前台执行的命令放到后台,并且暂停
三。jobs
查看当前有多少在后台运行的命令
四。fg
将后台中的命令调至前台继续运行
如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
五。bg
将一个在后台暂停的命令,变成继续执行
如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
 
#Linux下使用Shell命令控制任务Jobs执行
下列命令可以用来操纵进程任务:
ps 列出系统中正在运行的进程;
kill 发送信号给一个或多个进程(经常用来杀死一个进程);
jobs 列出当前shell环境中已启动的任务状态,若未指定jobsid,则显示所有活动的任务状态信息;如果报告了一个任务的终止(即任务的状态被标记为Terminated),shell 从当前的shell环境已知的列表中删除任务的进程标识;
bg 将进程搬到后台运行(Background);
fg 将进程搬到前台运行(Foreground);

16.2.(kill,killall,pkill)

16.3.crontab

功能:类似于windows计划任务的一个命令,功能非常强大

依赖于crond后台进程

语法:crontab [-u user] file

          crontab [-u user] [-l | -r | -e] [-i] [-s]

常用选项:

-u:用户名,只有root用户才能进行任务,创建、修改、删除

-e:编辑crontab文件

-l:查看crontab文件内容

-r:删除crontab文件

安装:

yum install cronie

crontab的域

下面就是这些域:


第1列分钟1~5 9

第2列小时1~2 3(0表示子夜)

第3列日1~3 1

第4列月1~1 2

第5列星期0~6(0表示星期天)

第6列要运行的命令


下面是crontab的格式:

分< >时< >日< >月< >星期< >要运行的命令

其中< >表示空格。

示例:

 

30 21* * * /apps/bin/cleanup.sh
说明:表示每晚的2 1 : 3 0运行/apps/bin/cleanup.sh
0 5,17 * * * /scripts/script.sh
说明:每天 5:00和17:00执行任务
* * * * *  /scripts/script.sh
说明:每分钟执行一次任务,通常情况下,没有每分钟都需要执行的脚本
*/10 * * * * /scripts/monitor.sh
说明:每 10min 执行一次任务
* * * jan,may,aug * /script/script.sh
说明:在特定的某几个月执行任务
0 17 * * sun,fri /script/scripy.sh
说明:在每周五、周日的17点执行任务
0 2 * * sun  [ $(date +%d) -le 07 ] && /script/script.sh
说明:在某个月的第一个周日执行任务
0 */4 * * * /scripts/script.sh
说明:每四个小时执行一个任务
0 4,17 * * sun,mon /scripts/script.sh
说明:每周一、周日执行任务
* * * * * /scripts/script.sh
* * * * *  sleep 30; /scripts/script.sh
说明:每个30秒执行一次任务因为最小的是1min。可以另辟蹊径
* * * * * /scripts/script.sh; /scripts/scrit2.sh
说明:多个任务在一条命令中配置
@yearly /scripts/script.sh
说明:每年执行一次任务,@yearly 类似于“0 0 1 1 *”。它会在每年的第一分钟内执行,通常我们可以用这个发送新年的问候。每年每月每天每分也可以这样写,得测试下
@reboot /scripts/script.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 : 1 0运行一个find命令
0,30 18-23 * * * /apps/bin/dbcheck.sh
说明:表示在每天1 8 : 0 0至2 3 : 0 0之间每隔3 0分钟运行/apps/bin/dbcheck.sh
0 23 * * 6 /apps/bin/qtrend.sh
说明:表示每星期六的23点运行 /apps/bin/qtrend.sh
crontab -e
添加或更新crontab中的命令
crontab -u username -e
需要编辑其他用户的命令集合,需要使用到如下的命令
crontab -l
查看当前系统登录用户的Crontab命令集合
crontab -u username -l
查看其他用户的Crontab命令集合

访问控制:
/etc/cron.deny 只拒绝
/etc/cron.allow 默认不存在,可以自己创建
如果cron.deny和cron.allow文件冲突,谁优先?自己测试

问题:
如果crontab -e 写了一个每天晚上6:30关机的任务;当还没有到晚上6:30我手动关机了,第二天会不会当我开机后隔一段时间自动关机?
如果我把关机的命令写成一个脚本放到 /etc/cron.daily/里,当我手动关机后,第二天开机会不会自动关机?

16.4.pstree

16.5.nice/renice

16.6.nohup

功能:把当前命令行运行的进程放到后台,以至于退出窗口进程不会退出。

语法: nohup command &

示例:

16.7.runlevel

16.8.service

16.9.at

功能:crontab实现的是定时执行任务,特定任务运行一次,就需要用到at

一次性计划任务,依赖于atd后台进程

语法:at [-f script] [-m -l -r] [time] [date]

命令格式:

at 3:30pm

at 15:30

at now

at now +1min

at 4:30pm tomorrow

at 13:00 +3days

at -t 05201430

at -t 201708081530

复杂的任务可以放到脚本里执行:

at 时间格式 -f xxx.sh

常用选项:

-f:script 是所要提交的脚本或命令。

-d 删除计划任务 等于atrm

-c 查看任务内容

-l:列出任务。等于atq

-r:清除任务。为了清除某个任务,还要提供相应的任务标识( I D);有些U N I X变体只接受a t r m作为清除命令。

-m:任务完成后给用户发邮件。

time:at命令的时间格式非常灵活;可以是H、H H . H H M M、H H : M M或H : M,其中H和M分别是小时和分钟。还可以使用a . m .或p . m .。

date:日期格式可以是月份数或日期数,而且a t命令还能够识别诸如t o d a y、t o m o r r o w这样的词。

示例:

 

# rpm -q at  查看软件是否安装
at-3.1.10-43.el6_2.1.x86_64

# rpm -ql at  查看软件所带来的文件列表
/etc/at.deny 控制列表文件,拒绝该文件里的使用at服务; at.allow默认不存在,自己创建,只允许该文件里的人使用
/etc/pam.d/atd 验证机制
/etc/rc.d/init.d/atd 启动脚本
/etc/sysconfig/atd 子配置文件
/usr/bin/at 二进制命令
/usr/bin/atq 查看任务列表
/usr/bin/atrm 删除任务
/usr/bin/batch 以低优先级去创建任务
/usr/sbin/atd 二进制的命令

# /etc/init.d/atd start
# chkconfig atd on
# service atd status  查看服务的运行状态
atd (pid  2188) is running...
# chkconfig --list|grep atd  开机自动启动
atd                0:off    1:off    2:off    3:on    4:on    5:on    6:off

1、提示符方式
# su sam
$ at 10:40
warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh
at> find /etc -name "passwd" -print
at> 
job 1 at 2004-11-02 10:40
说明:< E O T >就是< C T R L - D >。在10:40系统将执行一个简单的f i n d命令。提交的任务被分配了一个唯一标识job 1。该命令在完成以后会将全部结果以邮件的形式发送给我。

下面这些日期/时间格式都是a t命令可以接受的:
at 5.00am May23
at 11.20pm
at now +2 hour
at 9am tomorrow
at 15:00 May24
at now + 10 minutes

2、命令行方式
如果希望向a t命令提交一个s h e l l脚本,使用其命令行方式即可。在提交脚本时使用- f选项。
如:
$ touch db_table.sh
$ at 3:00pm tomorrow -f db_table.sh
warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh
job 3 at 2004-11-02 15:00
d b _ t a b l e . s h的脚本将在2004-11-02 15:00运行

3、还可以使用e c h o命令向a t命令提交任务
$ echo find /etc -name "passwd" -print | at now +1 minute
warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh
job 4 at 2004-11-01 19:07
列出所提交的任务
一个任务被提交后,可以使用at -l命令来列出所有的任务:
$ at -l
1      2004-11-02 10:40 a sam
3      2004-11-02 15:00 a sam
4      2004-11-01 19:07 a sam
其中,第一行是任务标识,后面是任务运行的日期/时间。最后一列a代表a t。
还可以使用a t q命令来完成同样的功能,它是a t命令的一个链接。
直接>atq,相当于>at -l

当提交一个任务后,它就被拷贝到/ v a r / s p o o l / a t目录中,准备在要求的时间运行。
# pwd
/var/spool/at
# ls -l
清除一个任务

清除任务的命令格式为:
atrm [job no] 或at -r [job no]

要清除某个任务,首先要执行at -l命令,以获取相应的任务标识,然后对该任务标识使用at -r 命令,清除该任务。
$ at -l
1      2004-11-02 10:40 a sam
3      2004-11-02 15:00 a sam
4      2004-11-01 19:07 a sam
$at -r 3
$at -l
1      2004-11-02 10:40 a sam
4      2004-11-01 19:07 a sam
有些系统使用at-r [job no]命令清除任务。

# at 14:18 072414        --定时的时间 后面是14年7月24号
at> echo "haha" > /dev/pts/5
at>             --ctrl+d结束
job 1 at 2014-07-24 14:18    --job 1表示一个编号,我这里是系统的第一次at任务所以为1.后面是定时的时间

如果你要做的事步骤比较多,则先写成脚本,然后调用
at -f xxx.sh

# vim /tmp/1.sh
#!/bin/bash

echo 1 > /dev/pts/5
echo 2 > /dev/pts/5
echo 3 > /dev/pts/5

[root@li ~]# at now + 1 minutes -f /tmp/1.sh
job 2 at 2014-07-24 14:26
[root@li ~]# at now + 1 hours -f /tmp/1.sh
job 3 at 2014-07-24 15:25
[root@li ~]# at now + 1 days -f /tmp/1.sh
job 4 at 2014-07-25 14:25
[root@li ~]# at now + 1 months -f /tmp/1.sh
job 5 at 2014-08-24 14:25
[root@li ~]# at now + 1 years -f /tmp/1.sh
job 6 at 2015-07-24 14:25

# at now +1min
at> wall "hello world"
at> 
ctrl+d 结束输入
job 1 at 2016-04-11 10:23


# at 14:00 +3 days
at> echo hello > /tmp/test.at
at> 
ctrl+d 结束输入

ls /var/spool/at 目录里存放的是所有at服务的计划任务
# ls /var/spool/at/
a0000201737408  spool

cat a0000201737408 等于 at -c 2 查看任务内容
# at -d 2 或者atrm 删除任务 那么/var/spool/at/里面相对应的脚本文件删了
如果想修改job内容,直接修改脚本文件就可以

vim useradd.sh
#!/bin/bash
for i in 1 2 3
do
  useradd u0$i
  echo user is ok >>/tmp/test.at
done

chmod +x useradd.sh

at now -f /root/useradd.sh

测试验证
at服务的访问控制
/etc/at.deny 默认只拒绝该文件里的用户
/etc/at.allow 默认没有,如果存在,只允许在at.allow文件里的用户使用
如果at.deny和at.allow冲突,at.allow 允许优先

16.10.&

功能:命令放入后台执行

示例:

 

查找名为“httpd.conf”的文件,并把所有标准输出和错误输出重定向到f i n d . d t的文件中:
# find /etc/httpd/ -name "httpd.conf" -print >find.dt 2>&1 &
[2] 7832
[1]   Done                    find /etc/ -name "httpd.conf" -print >find.dt 2>&1 &
成功提交该命令之后,系统给出了它的进程号7832。