Bash 当脚本';谁的后台工作完成了?

Bash 当脚本';谁的后台工作完成了?,bash,scripting,background,jobs,notify,Bash,Scripting,Background,Jobs,Notify,我的问题与此非常相似,只是我的后台过程是从脚本开始的。我可能做错了什么,但当我尝试这个简单的例子时: #!/bin/bash set -mb # enable job control and notification sleep 5 & 当sleep background命令完成时,我从未收到通知。但是,如果我直接在终端中执行相同的操作 $ set -mb $ sleep 5 & $ [1]+ Done sleep 5 我看到

我的问题与此非常相似,只是我的后台过程是从脚本开始的。我可能做错了什么,但当我尝试这个简单的例子时:

#!/bin/bash
set -mb  # enable job control and notification
sleep 5  &
当sleep background命令完成时,我从未收到通知。但是,如果我直接在终端中执行相同的操作

$ set -mb  
$ sleep 5  &
$
[1]+  Done                    sleep 5
我看到了我期望的结果

我在用bash对付cygwin。我猜这可能与输出的定向位置有关,但是尝试各种输出重定向,我没有更进一步


编辑:所以我有更多关于为什么的信息(thx到jkramer),但仍在寻找如何。如何获得从脚本启动的后台进程已终止的“推送”通知?将PID保存到文件并轮询不是我想要的。

shell的作业控制只影响由终端控制的进程,即直接从shell启动的任务

当父进程(脚本)死亡时,init进程自动成为子进程(sleep命令)的父进程,有效地终止所有输出。试试这个例子:

[jkramer/sgi5k:~]# cat foo.sh
#!/bin/bash

sleep 20 &
echo $!
[jkramer/sgi5k:~]# bash foo.sh 
19638
[jkramer/sgi5k:~]# ps -ef | grep 19638
jkramer  19638     1  0 23:08 pts/3    00:00:00 sleep 20
jkramer  19643 19500  0 23:08 pts/3    00:00:00 grep 19638

如您所见,脚本终止后睡眠的父进程是1,即init进程。如果您需要得到有关子进程终止的通知,您可以保存$的内容!变量(上次创建的进程的PID)并使用“wait”命令等待其终止。

shell的作业控制仅影响终端控制的进程,即直接从shell启动的任务

当父进程(脚本)死亡时,init进程自动成为子进程(sleep命令)的父进程,有效地终止所有输出。试试这个例子:

[jkramer/sgi5k:~]# cat foo.sh
#!/bin/bash

sleep 20 &
echo $!
[jkramer/sgi5k:~]# bash foo.sh 
19638
[jkramer/sgi5k:~]# ps -ef | grep 19638
jkramer  19638     1  0 23:08 pts/3    00:00:00 sleep 20
jkramer  19643 19500  0 23:08 pts/3    00:00:00 grep 19638

如您所见,脚本终止后睡眠的父进程是1,即init进程。如果您需要得到有关子进程终止的通知,您可以保存$的内容!变量(上次创建的进程的PID)并使用“wait”命令等待其终止。

如果将其作为源文件运行。然后它可以通知。e、 g

cat foo.sh

#!/bin/bash
set -mb  # enable job control and notification
sleep 5  &

. foo.sh
[1]+  Done                    sleep 5

如果您将其作为源文件运行。然后它可以通知。e、 g

cat foo.sh

#!/bin/bash
set -mb  # enable job control and notification
sleep 5  &

. foo.sh
[1]+  Done                    sleep 5

谢谢,jkramer-非常有启发性。所以我需要做一些不同的事情,但是使用wait命令否定了将子进程发送到后台的意义。我想调用脚本(可以选择作为子进程的后台),然后继续使用相同的终端。如果它正在等待,那么终端将不可用,对吗?因此,如果我保存PID以供以后参考,我仍然需要定期轮询以查看它是否完成,同时我希望将通知推送给我。谢谢,jkramer-信息非常丰富。所以我需要做一些不同的事情,但是使用wait命令否定了将子进程发送到后台的意义。我想调用脚本(可以选择作为子进程的后台),然后继续使用相同的终端。如果它正在等待,那么终端将不可用,对吗?因此,如果我保存PID以供以后参考,我仍然需要定期轮询以查看是否完成了,同时我希望将通知推送给我。这个集合-b是我一直在寻找的神奇选项。来自tcsh,我期待着“set notify”能够工作……这个set-b是我一直在寻找的神奇选项。来自tcsh,我希望“设置通知”能起作用。。。