标签: jobs

后台工作去哪里了?

从 gnome-terminal 我知道可以使用 Cz 暂停作业,然后将其发送到后台。当我关闭终端时,过程并没有结束。工作是从哪里管理的,还是丢失了?

shell job-control jobs background-process

5
推荐指数
1
解决办法
3387
查看次数

什么时候会收到错误消息“jobs : not found”?

jobs命令何时发出消息jobs : not found
另外,为什么该命令man jobs拒绝显示该命令的任何条目jobs
PS:我能够jobs在终端上成功执行命令

man jobs

4
推荐指数
1
解决办法
1989
查看次数

为什么在脚本中的子 shell 中运行时,“作业”总是为已完成的进程返回一行?

正常情况下,当一个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)

shell bash shell-script jobs

4
推荐指数
1
解决办法
712
查看次数

进程表中仍出现不认可的“已停止”作业进程

我想知道为什么在否认停止的进程后,它仍然出现进程表

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)

process ps jobs background-process

4
推荐指数
1
解决办法
3843
查看次数

为什么jobs 命令在shell 脚本中不起作用?

如果我jobs -l在命令提示符下运行,它会显示正在运行的作业的状态,但如果我在文件 ./tmp.sh 下运行

#! /bin/bash
jobs -l
Run Code Online (Sandbox Code Playgroud)

它显示空输出。

为什么会这样,我如何获取有关 shell 脚本中特定作业状态的信息?

shell job-control shell-script jobs

4
推荐指数
1
解决办法
3396
查看次数

防止 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)

但是你最好不要有另一个重要的过程以这个名字命名,否则它也会被抹杀。

  1. 我想知道,是否有更好或可接受的方法来处理在创建它们的脚本(或进程)退出时应该退出的分叉 shell 中的后台作业?

  2. 如果没有比盲目地pkilling使用相同名称的所有进程更好的方法,那么应该如何处理与网络服务器之类的东西一起运行的重复作业以退出?我想避免cron工作,因为脚本位于git存储库中,并且代码应该是自包含的,而无需更改 …

bash fork concurrency jobs background-process

4
推荐指数
1
解决办法
1570
查看次数

使 zsh jobs -p 的行为与 bash 中一样

有没有办法让jobs -pzsh 的行为与 bash 一样,即。给出 一个数字,这样就可以做什么kill $(jobs -p)

zsh jobs

4
推荐指数
1
解决办法
966
查看次数

快速访问后台作业的工作目录

重现我正在寻找的东西的最小努力如下

/$ sleep 1h &
[1] 6564
/$ cd
~$ jobs
[1]+  Running                 sleep 1h &  (wd: /)
Run Code Online (Sandbox Code Playgroud)

当我jobs用来管理我的后台进程时,工作目录(wd)与当前目录不同时也会显示出来。

有没有一种简单的方法可以轻松切换到这个显示的工作目录?我正在使用 bash 3.2。

我不是在寻找使用awk或类似工具的包装函数,而是在寻找内置解决方案的 shell。

bash directory cd-command jobs background-process

3
推荐指数
1
解决办法
2168
查看次数

Shell 函数来检查是否有一个挂起的进程是这个 shell 的子进程?

我想在我的 PS1 中添加一个指示器,显示是否有进程被 ctrl+z 挂起。为此,我需要一个能够检查这种情况的函数。我什至不确定从哪里开始考虑这个问题。谷歌让我失望了。有任何想法吗?

shell bash zsh jobs background-process

3
推荐指数
1
解决办法
494
查看次数

make 命令中使用 $($(nproc) + 1) 的逻辑是什么?

我试图根据一些在线指南在 Ubuntu 中安装 OpenCV。就是其中一本指南。它有以下行:

make -j $(($(nproc) + 1))
Run Code Online (Sandbox Code Playgroud)

返回nproc系统上可用的处理器/线程的数量。那么,比现有的更高的有什么优势呢?

cpu make jobs

3
推荐指数
1
解决办法
7013
查看次数