作业控制是shell和tty驱动程序中的一组功能,它允许用户从单个交互式shell管理多个作业。
作业是单个命令或管道。如果您运行ls
,那是一份工作。如果您运行ls|more
,那仍然只是一项工作。如果您运行的命令启动它自己的子进程,那么它们也将属于同一个作业,除非它们被有意分离。
如果没有作业控制,您可以通过将&
添加到命令行中来将作业置于后台。这就是你所有的控制。
作业控制,您还可以:
- 挂起正在运行的前台作业与按Ctrlž
- 继续在前台挂起的作业与
fg
- 继续暂停作业与
bg
- 的背景与带来正在运行的后台作业前景0
shell维护一个作业列表,通过运行jobs
命令可以看到。每个人都被分配一个工作号(与构成工作的过程的PID不同)。您可以使用以%
为前缀的作业编号作为参数fg
或bg
以选择作业为前景或背景。 shell的内建kill
命令也可以接受%jobnumber表示法。这可能很方便,因为作业编号从1开始分配,所以它们比PID短。
也有快捷键%+
为先前前景化工作的最近前景化工作,%-
,这样你就可以来回切换迅速两份工作按Ctrl之间,ž其次fg %-
(暂停当前一个,恢复另一个),而不必记住数字。或者你可以使用命令本身的开始。如果您已暂停ffmpeg
命令,则恢复该命令与fg %ff
一样简单(假定没有其他活动作业以“ff”开头)。作为最后一个捷径,您不必输入fg
。只要输入%-
作为一个命令前面的工作前景。
“但为什么我们需要这个?”我可以听到你问。 “如果我想运行另一个命令,我可以启动另一个shell。”诚然,有多种多任务处理方式。在正常的日子里,我的登陆shell在tty1到tty10上运行(是的,超过6个,你只需要激活它们),其中一个将运行一个屏幕会话,其中4个屏幕,另一个可能有一个ssh运行在其上有另一个屏幕会话在远程机器上运行,加上我的X会话有3或4个xterm。我仍然使用工作控制。
如果我在vi
或less
或或任何其他互动的东西中间,我需要运行其他几个快捷命令来决定如何进行,按Ctrlž,运行命令,和fg
是自然而快速的。 (在很多情况下,一个交互式程序有一个!
键绑定为你运行一个外部命令;我认为这并不好,因为你没有得到shell的历史,命令行编辑器和完成系统的好处。)当我看到有人启动辅助xterm/screen /无论运行哪一个命令,看它两秒钟,然后退出时,我感到很伤心。
现在关于你的脚本。总的来说,它似乎没有写得很好。有问题的线路:
bash -i -c "ssh -D 7070 -N [email protected] > /dev/null"
令人困惑。我无法弄清楚为什么ssh命令被传递到一个单独的shell而不是直接从主脚本执行,更不用说为什么有人添加了-i
。 -i
选项告诉shell以交互方式运行,这会激活作业控制(等等)。但它并没有真正被交互使用。无论背后单独的壳和-i
的目的是什么,关于工作控制的警告是一个副作用。我猜测这是一个破解ssh的一些不受欢迎的功能的黑客。这是当你这样做的时候,你应该评论它。
我无法从你的问题告诉你是否要在一般的外壳上作业控制信息,或解释为什么在某些情况下工作控制不可用。 – kojiro 2012-08-06 00:46:49
他们两人:)它可能是一个非常广泛的话题,所以指向职位的人也非常感激。我谷歌搜索了一段时间,所有的结果都是关于非常具体的情况,没有一个是关于幕后的故事。 – luanjunyi 2012-08-06 03:39:32
是否有你启动一个新shell来启动SSH的原因?从命令行运行你的脚本不会给我“无工作控制”,尽管它只是挂在SSH执行上,实际上它应该这样做。所以从技术上讲,“其他”不会被打到。你从哪里运行这个脚本? crontab的? – favoretti 2012-08-06 06:54:34