【发布时间】:2013-12-18 17:50:34
【问题描述】:
(OSX 10.7) 我们使用的应用程序让我们分配脚本以在应用程序中发生某些活动时调用。我已经分配了一个 bash 脚本并且它正在被调用,问题是我需要做的是执行一些命令,等待 30 秒,然后再执行一些命令。如果我让我的 bash 脚本执行“睡眠 30”,那么整个应用程序会在等待我的脚本完成时冻结 30 秒。
我尝试将 30 秒的等待(和第二组命令)放入单独的脚本并调用“./secondScript &”,但应用程序仍然在那里等待 30 秒,什么也不做。我假设应用程序正在等待脚本和所有子进程终止。
我已经尝试了这些变体来从主脚本中调用第二个脚本,它们都有同样的问题:
- nohup ./secondScript &
- ( ( ./secondScript & ) & )
- ( ./secondScript & )
- nohup 脚本 -q /dev/null secondScript &
我无法更改应用程序并告诉它启动我的脚本而不是等待它完成。
如何启动一个进程(我希望该进程使用脚本语言)以使新进程不是当前进程的子进程?
谢谢, 克里斯
附言我尝试了“拒绝”命令,它也没有帮助。我的主脚本如下所示:
[initial commands]
echo Launching second script
./secondScript &
echo Looking for jobs
jobs
echo Sleeping for 1 second
sleep 1
echo Calling disown
disown
echo Looking again for jobs
jobs
echo Main script complete
我得到的输出是这样的:
Launching second script
Looking for jobs
[1]+ Running ./secondScript &
Sleeping for 1 second
Calling disown
Looking again for jobs
Main script complete
此时调用应用程序会在那里停留 45 秒,等待 secondScript 完成。
pps
如果在主脚本的顶部执行“ps”,它返回的唯一内容是我在单独的终端窗口中打开的交互式 bash 会话的进程 ID。
$SHELL 的值为 /bin/bash
如果我执行“ps -p $$”,它会正确告诉我
PID TTY TIME CMD
26884 ?? 0:00.00 mainScript
如果我执行“lsof -p $$”,它会给我各种结果(我没有在此处粘贴所有列,假设它们不相关):
FD TYPE NAME
cwd DIR /private/tmp/blahblahblah
txt REG /bin/bash
txt REG /usr/lib/dyld
txt REG /private/var/db/dyld/dyld_shared_cache_x86_64
0 PIPE
1 PIPE -> 0xffff8041ea2d10
2 PIPE -> 0xffff 8017d21cb
3r DIR /private/tmp/blahblah
4r REG /Volumes/DATA/blahblah
255r REG /Volumes/DATA/blahblah
【问题讨论】:
-
mainScript 的父级是什么?
-
mainScript 正在从未命名的应用程序 (CVS) 启动。你可以告诉 CVS“当用户提交文件时启动我的脚本”。
-
在这种情况下,您的脚本没有直接在 bash shell 上运行,而应用程序正在执行 shell 职责,这就解释了很多。您将不得不求助于在应用程序的进程树之外启动缓慢的进程。
-
我认为 CVS 只是在做一个系统(“/bin/bash mainScript.sh”),CVS 甚至可以承担什么“shell 职责”?
-
如果 CVS 只是在做 (/bin/bash mainScript) 你会在
pstree -p看到启动的 bash shell 作为 mainScript 的父级,而 CVS 作为那个 bash shell 的父级。如果 CVS 是 mainScript 的直接父级,则不涉及 bash shell。 CVS 会做的是以一种非常简陋的方式“模仿”bash 来拦截每个系统调用。