(OSX 10.7)我们使用的应用程序让我们分配在应用程序中发生某些 Activity 时要调用的脚本。我分配了一个bash脚本,它被调用了,问题是我需要做的是执行一些命令,等待30秒,然后再执行一些命令。如果我的bash脚本执行“sleep 30”,则整个应用程序将冻结30秒,同时等待脚本完成。

我尝试将30秒等待时间(和第二组命令)放入单独的脚本中,然后调用“./secondScript&”,但应用程序仍然在那儿停留了30秒钟,却什么也没做。我假设应用程序正在等待脚本和所有子进程终止。

我尝试了这些变体,以便从主脚本中调用第二个脚本,它们都有相同的问题:

  • nohup ./secondScript和
  • ((./secondScript&)&)
  • (./secondScript&)
  • nohup脚本-q/dev/null secondScript和

  • 我没有能力更改应用程序并告诉它启动我的脚本,而不等待它完成。

    我如何启动一个流程(我希望该流程使用脚本语言),以使新流程不是当前流程的子流程?

    谢谢,
    克里斯

    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/

    10-13 09:38