fg,bg,jobs,&,ctrl+z 都是跟系统任务有关的, 虽然现在基本上不怎么需要用到这些命令, 但学会了也是很实用的.
1,& (最经常被用到)
这个用在一个命令的最后, 可以把这个命令放到后台执行
2,ctrl + z
可以将一个正在前台执行的命令放到后台, 并且暂停
3,jobs
查看当前有多少在后台运行的命令
4,fg
将后台中的命令调至前台继续运行
如果后台中有多个命令, 可以用 fg %jobnumber 将选中的命令调出,%jobnumber 是通过 jobs 命令查到的后台正在执行的命令的序号(不是 pid)
5,bg
将一个在后台暂停的命令, 变成继续执行.
如果后台中有多个命令, 可以用 bg %jobnumber 将选中的命令调出,%jobnumber 是通过 jobs 命令查到的后台正在执行的命令的序号(不是 pid)
Linux 下使用 Shell 命令控制任务 Jobs 执行
下列命令可以用来操纵进程任务:
ps 列出系统中正在运行的进程;
kill 发送信号给一个或多个进程(经常用来杀死一个进程);
jobs 列出当前 shell 环境中已启动的任务状态, 若未指定 jobsid, 则显示所有活动的任务状态信息; 如果报告了一个任务的终止(即任务的状态被标记为 Terminated),shell 从当前的 shell 环境已知的列表中删除任务的进程标识;
bg 将进程搬到后台运行(Background);
fg 将进程搬到前台运行(Foreground);
将 job 转移到后台运行
如果你经常在 X 图形下工作, 你可能有这样的经历: 通过终端命令运行一个 GUI 程序, GUI 界面出来了, 但是你的终端还停留在原地, 你不能在 shell 中继续执行其他命令了, 除非将 GUI 程序关闭.
为了使程序执行后终端还能继续接受命令, 你可以将程序转移到后台运行, 使用如下命令运行程序: (假设要运行 xmms)
# xmms &
这样打开 xmms 后, 终端的提示又回来了. 现在 xmms 在后台运行着呢; 但万一你运行程序时忘记使用 & 了, 又不想重新执行; 你可以先使用 ctrl + z 挂起程序, 然后敲入 bg 命令, 这样程序就在后台继续运行了.
[概念]
当前任务
如果后台的任务号有 2 个,[1],[2]; 如果当第一个后台任务顺利执行完毕, 第二个后台任务还在执行中时, 当前任务便会自动变成后台任务号码 "[2]" 的后台任务. 所以可以得出一点, 即当前任务是会变动的. 当用户输入 "fg","bg" 和 "stop" 等命令时, 如果不加任何引号, 则所变动的均是当前任务.
察看 jobs
使用 jobs 或 ps 命令可以察看正在执行的 jobs.
jobs 命令执行的结果,+ 表示是一个当前的作业, 减号表是是一个当前作业之后的一个作业, jobs -l 选项可显示所有任务的 PID,jobs 的状态可以是 running, stopped, Terminated, 但是如果任务被终止了(kill),shell 从当前的 shell 环境已知的列表中删除任务的进程标识; 也就是说, jobs 命令显示的是当前 shell 环境中所起的后台正在运行或者被挂起的任务信息;
进程的挂起
后台进程的挂起:
在 solaris 中通过 stop 命令执行, 通过 jobs 命令查看 job 号(假设为 num), 然后执行 stop %num;
在 RedHat 中, 不存在 stop 命令, 可通过执行命令 kill -stop PID, 将进程挂起;
当要重新执行当前被挂起的任务时, 通过 bg %num 即可将挂起的 job 的状态由 stopped 改为 running, 仍在后台执行; 当需要改为在前台执行时, 执行命令 fg %num 即可;
前台进程的挂起:
ctrl+Z;
进程的终止
后台进程的终止:
方法一:
通过 jobs 命令查看 job 号(假设为 num), 然后执行 kill %num
方法二:
通过 ps 命令查看 job 的进程号(PID, 假设为 pid), 然后执行 kill pid
前台进程的终止:
ctrl+c
kill 的其他作用
kill 除了可以终止进程, 还能给进程发送其它信号, 使用 kill -l 可以察看 kill 支持的信号.
SIGTERM 是不带参数时 kill 发送的信号, 意思是要进程终止运行, 但执行与否还得看进程是否支持. 如果进程还没有终止, 可以使用 kill -SIGKILL pid, 这是由内核来终止进程, 进程不能监听这个信号.
==================================================================================================================
Unix/Linux 下一般想让某个程序在后台运行, 很多都是使用 & 在程序结尾来让程序自动运行. 比如我们要运行 MySQL 在后台:
/usr/local/MySQL/bin/mysqld_safe --user=MySQL &
但是我们很多程序并不象 mysqld 一样可以做成守护进程, 可能我们的程序只是普通程序而已, 一般这种程序即使使用 & 结尾, 如果终端关闭, 那么程序也会被关闭. 为了能够后台运行, 我们需要使用 nohup 这个命令, 比如我们有个 start.sh 需要在后台运行, 并且希望在后台能够一直运行, 那么就使用 nohup:
nohup /root/start.sh &
在 shell 中回车后提示:
[~]$ appending output to nohup.out
原程序的的标准输出被自动改向到当前目录下的 nohup.out 文件, 起到了 log 的作用.
但是有时候在这一步会有问题, 当把终端关闭后, 进程会自动被关闭, 察看 nohup.out 可以看到在关闭终端瞬间服务自动关闭.
==================================================================================================================
nohup 命令
用途: 不挂断地运行命令.
语法: nohup Command [ Arg ... ] [ & ]
描述: nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令, 忽略所有挂断 (SIGHUP) 信号. 在注销后使用 nohup 命令运行后台中的程序. 要运行后台中的 nohup 命令, 添加 & ( 表示 "and" 的符号)到命令的尾部.
无论是否将 nohup 命令的输出重定向到终端, 输出都将附加到当前目录的 nohup.out 文件中. 如果当前目录的 nohup.out 文件不可写, 输出重定向到 $HOME/nohup.out 文件中. 如果没有文件能创建或打开以用于追加, 那么 Command 参数指定的命令不可调用. 如果标准错误是一个终端, 那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符.
退出状态: 该命令返回下列出口值:
126 可以查找但不能调用 Command 参数指定的命令.
127 nohup 命令发生错误或不能查找由 Command 参数指定的命令.
否则, nohup 命令的退出状态是 Command 参数指定命令的退出状态.
nohup 命令及其输出文件
nohup 命令: 如果你正在运行一个进程, 而且你觉得在退出帐户时该进程还不会结束, 那么可以使用 nohup 命令. 该命令可以在你退出帐户 / 关闭终端之后继续运行相应的进程. nohup 就是不挂起的意思( n ohang up).
该命令的一般形式为: nohup command &
使用 nohup 命令提交作业
如果使用 nohup 命令提交作业, 那么在缺省情况下该作业的所有输出都被重定向到一个名为 nohup.out 的文件中, 除非另外指定了输出文件:
nohup command> myout.file 2>&1 &
在上面的例子中, 输出被重定向到 myout.file 文件中.
使用 jobs 查看任务.
使用 fg %n 关闭.
另外有两个常用的 ftp 工具 ncftpget 和 ncftpput, 可以实现后台的 ftp 上传和下载, 这样就可以利用这些命令在后台上传和下载文件了.
简单而有用的 nohup 命令在 UNIX/Linux 中, 普通进程用 & 符号放到后台运行, 如果启动该程序的控制台 logout, 则该进程随即终止.
要实现守护进程, 一种方法是按守护进程的规则去编程(本站有文章介绍过), 比较麻烦; 另一种方法是仍然用普通方法编程, 然后用 nohup 命令启动程序:
nohup<程序名>&
则控制台 logout 后, 进程仍然继续运行, 起到守护进程的作用(虽然它不是严格意义上的守护进程).
使用 nohup 命令后, 原程序的的标准输出被自动改向到当前目录下的 nohup.out 文件, 起到了 log 的作用, 实现了完整的守护进程功能.
ygwu @ 2005 年 04 月 18 日 上午 10:03
For example:
如何远程启动 webLogic 服务?
用 telnet 远程控制服务器, 远程启动 WEBLOGIC 服务, 启动后关闭 telnet,WebLogic 服务也跟着停止, 这是因为使用 telnet 启动的进程会随着 telnet 进程的关闭而关闭. 所以我们可以使用一些 UNIX 下的命令来做到不关闭.
使用如下命令:
nohup startWeblogic.sh&
如果想要监控标准输出可以使用:
tail -f nohup.out
当在后台运行了程序的时候, 可以用 jobs 命令来查看后台作业的状态. 在有多个后台程序时, 要使用来参数的 fg 命令将不同序号的后台作业切换到前台上运行.
当用户启动一个进程的时候, 这个进程是运行在前台, 使用与相应控制终端相联系的标准输入, 输出进行输入和输出. 即使将进程的输入输出重定向, 并将进程放在后台执行, 进程仍然和当前终端设备有关系. 正因为如此, 在当前的登录会话结束时, 控制终端设备将和登录进程相脱离, 那么系统就向所有与这个终端相联系的进程发送 SIGHUP 的信号, 通知进程线路已经挂起了, 如果程序没有接管这个信号的处理, 那么缺省的反应是进程结束. 因此普通的程序并不能真正脱离登录会话而运行进程, 为了使得在系统登录后还可以正常执行, 只有使用命令 nohup 来启动相应程序.
使用命令 nohup 当然可以启动这样的程序, 但 nohup 启动的程序在进程执行完毕就退出, 而常见的一些服务进程通常永久的运行在后台, 不向屏幕输出结果. 在 Unix 中这些永久的后台进程称为守护进程(daemon). 守护进程通常从系统启动时自动开始执行, 系统关闭时才停止.
在守护进程中, 最重要的一个是超级守护进程 inetd, 这个进程接管了大部分网络服务, 但并不是对每个服务都自己进行处理, 而是依据连接请求, 启动不同的服务程序与客户机打交道. inetd 支持网络服务种类在它的设置文件 / etc/.NET.conf 中定义. .NET.conf 文件中的每一行就对应一个端口地址, 当 inetd 接受到连接这个端口的连接请求时, 就启动相应的进程进行处理. 使用 inetd 的好处是系统不必启动很多守护进程, 从而节约了系统资源, 然而使用 inetd 启动守护进程相应反应会迟缓一些, 不适合用于被密集访问的服务进程
来源: http://www.bubuko.com/infodetail-3101531.html