我不小心“停止”了我的telnet进程。现在我既不能“切换回”它,也不能杀死它(它不会响应kill 9292992929 是进程 ID。)
所以,我的问题是,如果你在 linux 命令行上有一个停止的进程,你如何切换回它,或者杀死它,而不必求助于kill -9?
适用的 Bash 手册页的完整部分仅说明:
如果运行 bash 的操作系统支持作业控制,则 bash 包含使用它的工具。在进程运行时输入挂起字符(通常是 ^Z、Control-Z)会导致该进程停止并将控制权返回给 bash。 输入延迟挂起字符(通常是 ^Y、Control-Y)会导致进程在尝试从终端读取输入时停止,并将控制权返回给 bash。 然后用户可以操纵这个作业的状态,使用
bg命令在后台继续它,fg命令在前台继续它,或 kill 命令将它杀死。A ^Z 立即生效,并具有导致挂起输出和预先输入被丢弃的额外副作用。
我从来没有用过Ctrl- Y; 我只是刚刚了解它。我只用Ctrl- Z(暂停)做得很好。
我试图想象这个选项的用途。什么时候有用?
(请注意,此功能并非在所有 Unix 变体上都存在。它存在于Solaris和 OpenBSD 上,但不存在于 Linux 或 FreeBSD 上。相应的设置是stty dsusp。)
也许不那么主观:有什么可以用Ctrl-Y不能用Ctrl-轻松完成的事情Z吗?
“是的,而且……”是即兴喜剧中的一个很棒的经验法则。在 UNIX 世界中则不然。
当我运行这个公认的愚蠢yes&命令时,我无法中断它。终端崩溃或陷入循环。
我希望该yes进程立即暂停,因为如果尝试写入标准输出,后台的任何进程都应该暂停,但情况似乎并非如此,我想知道为什么。
我已经知道按下会ctrl+z停止应用程序,然后我可以使用bg命令将应用程序发送到后台,但这意味着应用程序停止的时间很短。
如何在不停止的情况下将应用程序直接发送到后台?
有时您从终端运行程序,例如lxpanel†。终端不会让你回到提示,它会挂起。您可以按Ctrl+C返回提示,但这会杀死lxpanel. 但是,按Alt+ F2(弹出一个窗口以接收命令)并运行lxpanel正常。
为什么是这样?从终端运行命令与按Alt+时出现的“运行”窗口有什么不同F2?
†这里的 lxpanel 仅用作示例。我在多个程序中都经历过这种情况
我正在寻找诸如command1 ; command2如何运行之类的东西command2,command1但我想计划command2何时command1已运行的执行。
它可以通过输入command2并通过 Enter 确认来解决,假设command1不消耗标准输入,command1并且不会在输出上产生太多文本,使得输入不切实际(输入的字符与command1输出混合)。
正如我们所知,shell 使用户能够&在命令行的末尾运行后台进程。每个后台进程都由一个作业 ID 标识,当然,由它的 PID 标识。
当我执行新作业时,输出类似于[1] 1234(第二个数字是进程 ID)。尝试调用类似的命令stop 1并stop %1导致失败消息:stop: Unknown job: 1
了解该stop命令会导致作业暂停,我想知道如何获取作业 ID并正确执行。如果杀死作业的唯一方法是通过其进程 ID,那么作业 ID 的目的是什么?
我需要使用期望脚本在 700 个网络设备上做一些工作。我可以按顺序完成,但到目前为止运行时间约为 24 小时。这主要是由于建立连接所需的时间以及这些设备(旧设备)的输出延迟。我能够建立两个连接并让它们并行运行就好了,但是我能推多远呢?
我不认为我可以一次完成所有 700 个,肯定有一些限制。我的 VM 可以管理的 telnet 连接数。
如果我确实尝试在这样的某种循环中启动其中的 700 个:
for node in `ls ~/sagLogs/`; do
foo &
done
Run Code Online (Sandbox Code Playgroud)
和
CPU 12 个 CPU x Intel(R) Xeon(R) CPU E5649 @ 2.53GHz
内存 47.94 GB
我的问题是:
foo还是盒子会崩溃?不幸的是,我在公司生产环境中运行,所以我不能完全尝试看看会发生什么。
从我的理解,工作是管道从某一个shell启动的,你可以管理这些作业(fg,bg,按Ctrl-Z)从该壳体内。一个作业可以由多个进程/命令组成。
我的问题是当原始的包含 shell 退出时这些作业会发生什么?假设未设置 huponexit 以便后台进程在 shell 退出后继续运行。
假设我已经做了:
$ run.sh | grep 'abc' &
[1] job_id
Run Code Online (Sandbox Code Playgroud)
然后我退出这个shell。我将进入一个新的 shell 并运行jobs,但显然什么也看不到。但是我可以执行ps aux | grep run.sh并查看此进程的运行情况,我也会执行ps aux | grep grep并查看grep 'abc'运行的进程。
有没有办法只获取完整管道的作业 ID,以便我可以一次性杀死它,或者我是否必须在退出原始 shell 后与另一个 shell 分开杀死所有进程?(我尝试过后者并且它有效,但跟踪所有过程似乎很麻烦。)
我知道该jobs命令仅显示当前 shell 会话中运行的作业。
是否有 bash 代码可以显示当前用户跨 shell 会话的作业(例如,来自另一个终端选项卡的作业)?