从 gnome-terminal 我知道可以使用 Cz 暂停作业,然后将其发送到后台。当我关闭终端时,过程并没有结束。工作是从哪里管理的,还是丢失了?
jobs命令何时发出消息jobs : not found?
另外,为什么该命令man jobs拒绝显示该命令的任何条目jobs?
PS:我能够jobs在终端上成功执行命令
正常情况下,当一个job在后台启动时,在jobjobs完成后第一次运行会报告它已经完成,并且后续执行什么都不做:
$ ping -c 4 localhost &>/dev/null &
[1] 9666
$ jobs
[1]+ Running ping -c 4 localhost &> /dev/null &
$ jobs
[1]+ Done ping -c 4 localhost &> /dev/null
$ jobs ## returns nothing
$
Run Code Online (Sandbox Code Playgroud)
但是,当在脚本的子 shell 中运行时,它似乎总是返回一个值。这个脚本永远不会退出:
#!/usr/bin/env bash
ping -c 3 localhost &>/dev/null &
while [[ -n $(jobs) ]]; do
sleep 1;
done
Run Code Online (Sandbox Code Playgroud)
如果我tee在[[ ]]构造中使用来查看 的输出jobs,我会看到它总是在打印该Done ...行。正如我所料,不仅一次,而且显然是永远。
更奇怪的是,jobs在循环中运行会导致它按预期退出:
#!/usr/bin/env bash
ping -c 3 localhost …Run Code Online (Sandbox Code Playgroud) 我想知道为什么在否认停止的进程后,它仍然出现进程表
PING www.google.com (74.125.130.106) 56(84) bytes of data.
64 bytes from 74.125.130.106: icmp_seq=1 ttl=44 time=182 ms
64 bytes from 74.125.130.106: icmp_seq=2 ttl=44 time=209 ms
64 bytes from 74.125.130.106: icmp_seq=3 ttl=44 time=213 ms
64 bytes from 74.125.130.106: icmp_seq=4 ttl=44 time=122 ms
^Z
[1]+ Stopped ping www.google.com
anshul@anshul-Inspiron-N5010:~/Documents/workspace/shell$ jobs -l
[1]+ 10319 Stopped ping www.google.com
anshul@anshul-Inspiron-N5010:~/Documents/workspace/shell$ disown
bash: warning: deleting stopped job 1 with process group 10319
anshul@anshul-Inspiron-N5010:~/Documents/workspace/shell$ ps -ef | grep 10319
anshul 10319 9717 0 23:35 pts/25 00:00:00 ping www.google.com …Run Code Online (Sandbox Code Playgroud) 如果我jobs -l在命令提示符下运行,它会显示正在运行的作业的状态,但如果我在文件 ./tmp.sh 下运行
#! /bin/bash
jobs -l
Run Code Online (Sandbox Code Playgroud)
它显示空输出。
为什么会这样,我如何获取有关 shell 脚本中特定作业状态的信息?
如果我有一个 Bash 脚本,例如:
function repeat {
while :; do
echo repeating; sleep 1
done
}
repeat &
echo running once
Run Code Online (Sandbox Code Playgroud)
running once只打印一次,但repeatfork 永远存在,无休止地打印。
我应该如何防止repeat在创建它的脚本退出后继续运行?
我认为可能明确实例化一个新的bash -c解释器会迫使它在其父级消失时退出,但我猜孤立进程被initPID 1 采用。
使用另一个文件对此进行测试:
# repeat.bash
while :; do echo repeating; sleep 1; done
# fork.bash
bash -c "./repeat.bash & echo an exiting command"
Run Code Online (Sandbox Code Playgroud)
运行./fork.bash仍然会导致repeat.bash永远在后台继续运行。
简单而懒惰的解决方案是将行添加到fork.bash:
pkill repeat.bash
Run Code Online (Sandbox Code Playgroud)
但是你最好不要有另一个重要的过程以这个名字命名,否则它也会被抹杀。
我想知道,是否有更好或可接受的方法来处理在创建它们的脚本(或进程)退出时应该退出的分叉 shell 中的后台作业?
如果没有比盲目地pkilling使用相同名称的所有进程更好的方法,那么应该如何处理与网络服务器之类的东西一起运行的重复作业以退出?我想避免cron工作,因为脚本位于git存储库中,并且代码应该是自包含的,而无需更改 …
有没有办法让jobs -pzsh 的行为与 bash 一样,即。只给出
一个数字,这样就可以做什么kill $(jobs -p)?
重现我正在寻找的东西的最小努力如下
/$ sleep 1h &
[1] 6564
/$ cd
~$ jobs
[1]+ Running sleep 1h & (wd: /)
Run Code Online (Sandbox Code Playgroud)
当我jobs用来管理我的后台进程时,工作目录(wd)与当前目录不同时也会显示出来。
有没有一种简单的方法可以轻松切换到这个显示的工作目录?我正在使用 bash 3.2。
我不是在寻找使用awk或类似工具的包装函数,而是在寻找内置解决方案的 shell。
我想在我的 PS1 中添加一个指示器,显示是否有进程被 ctrl+z 挂起。为此,我需要一个能够检查这种情况的函数。我什至不确定从哪里开始考虑这个问题。谷歌让我失望了。有任何想法吗?
我试图根据一些在线指南在 Ubuntu 中安装 OpenCV。这就是其中一本指南。它有以下行:
make -j $(($(nproc) + 1))
Run Code Online (Sandbox Code Playgroud)
返回nproc系统上可用的处理器/线程的数量。那么,比现有的更高的有什么优势呢?
jobs ×10
bash ×4
shell ×4
job-control ×2
shell-script ×2
zsh ×2
cd-command ×1
concurrency ×1
cpu ×1
directory ×1
fork ×1
make ×1
man ×1
process ×1
ps ×1