(OSX 10.7)我们使用的应用程序让我们分配在应用程序中发生某些 Activity 时要调用的脚本。我分配了一个bash脚本,它被调用了,问题是我需要做的是执行一些命令,等待30秒,然后再执行一些命令。如果我的bash脚本执行“sleep 30”,则整个应用程序将冻结30秒,同时等待脚本完成。
我尝试将30秒等待时间(和第二组命令)放入单独的脚本中,然后调用“./secondScript&”,但应用程序仍然在那儿停留了30秒钟,却什么也没做。我假设应用程序正在等待脚本和所有子进程终止。
我尝试了这些变体,以便从主脚本中调用第二个脚本,它们都有相同的问题:
我没有能力更改应用程序并告诉它启动我的脚本,而不等待它完成。
我如何启动一个流程(我希望该流程使用脚本语言),以使新流程不是当前流程的子流程?
谢谢,
克里斯
ps我尝试了“disown”命令,但它也无济于事。我的主要脚本如下所示:
[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完成。
点
如果在主脚本的顶部执行“ps”,那么它返回的唯一内容就是我在单独的终端窗口中打开的交互式bash session 的进程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
最佳答案
在Unix中执行此操作的典型方法是双叉。在bash中,您可以使用
( sleep 30 & )
(..)
创建一个子进程,&
创建一个孙子进程。当子进程死亡时,init继承孙进程。如果这不起作用,则您的应用程序不等待子进程。
它可能正在等待的其他内容包括 session 和打开锁定文件:
要创建一个新 session ,Linux有一个
setsid
。在OS X上,您可以通过script
进行操作,这也偶然会创建一个新 session :# Linux:
setsid sleep 30
# OS X:
nohup script -q -c 'sleep 30' /dev/null &
要查找继承的文件描述符的列表,可以使用
lsof -p yourpid
,它将输出类似以下内容的内容:sleep 22479 user 0u CHR 136,32 0t0 35 /dev/pts/32
sleep 22479 user 1u CHR 136,32 0t0 35 /dev/pts/32
sleep 22479 user 2u CHR 136,32 0t0 35 /dev/pts/32
sleep 22479 user 5w REG 252,0 0 1048806 /tmp/lockfile
在这种情况下,除了标准FD 0,FD 1和FD 2外,您还打开了带有锁定文件的fd 5,父级可以等待该文件。
要关闭fd 5,可以使用
exec 5>&-
。如果您认为锁定文件本身可能是stdin/stdout/stderr,则可以使用nohup
将其重定向到其他文件。关于linux - 如何启动不是原始流程的子流程的新流程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20338162/