Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 后台进程的返回值_Unix_Shell_Background_Return Value - Fatal编程技术网

Unix 后台进程的返回值

Unix 后台进程的返回值,unix,shell,background,return-value,Unix,Shell,Background,Return Value,我需要根据后台进程的返回值采取一些措施,即如果它首先终止 具体来说:在理想的操作中,我作为后台进程运行的服务器将永远保持运行。在这种情况下,将其保留在后台是有意义的,因为我希望我的shell脚本在生成服务器后执行其他操作。但是如果服务器异常终止,我希望最好使用服务器的exit返回值来决定是否终止我的主脚本。如果这不可能,我至少希望中止主脚本,而不是在服务器出现故障的情况下运行它 我正在寻找shell脚本异步回调的特性。一种解决方案是生成一个监视进程,定期检查服务器是否出现故障。最好不要在主she

我需要根据后台进程的返回值采取一些措施,即如果它首先终止

具体来说:在理想的操作中,我作为后台进程运行的服务器将永远保持运行。在这种情况下,将其保留在后台是有意义的,因为我希望我的shell脚本在生成服务器后执行其他操作。但是如果服务器异常终止,我希望最好使用服务器的exit返回值来决定是否终止我的主脚本。如果这不可能,我至少希望中止主脚本,而不是在服务器出现故障的情况下运行它


我正在寻找shell脚本异步回调的特性。一种解决方案是生成一个监视进程,定期检查服务器是否出现故障。最好不要在主shell脚本本身中使用它。

当子脚本通过捕获SIGCHLD退出时,可以使用shell陷阱调用函数。如果只有一个后台进程正在运行,那么您可以在sigchld处理程序中等待它,并在那里获取状态。如果有多个后台子系统运行,它会变得更复杂一些;下面是一个代码示例(仅使用bash测试):

set-m#启用作业控制
prtchld(){
作业列表=$(作业-l | tr“\n”“^”)
读时-a jl-d“^”do
如果[${jl[2]}==“退出”];则
作业=${jl[1]}
状态=${jl[3]}
任务=${jl[*]:4}
打破
fi

完成您可以将后台进程嵌套在脚本中。例如,如果希望发送到后台的进程称为foo:

#!/bin/sh

foo

if [ $? ]
then 
    # do something here if process failed
fi

然后在后台运行上面的脚本,而不是
foo
。如果需要关闭它,你可以杀死它,但如果
foo
继续运行,它将永远不会终止。如果foo死了,你可以根据它的错误代码做任何你想做的事情。

我想,出于我的目的,我更喜欢第一个脚本,我在e“如果进程失败,在这里做些什么”我可以通过使用它的名称来终止调用这个foo包装器脚本的脚本

我认为第一种解决方案适用于多个孩子。无论如何,我必须尽快完成这项工作,因此我使用了一种适用于我的应用程序的黑客:

我在主脚本中像往常一样在后台启动进程,然后使用$!获取它的pid(因为$!返回最后一个bg pid),休眠2秒钟,然后根据返回值(ps-e | grep pid)执行ps-e | grep pid检查进程是否仍然存在。这对我很有效,因为如果我的后台进程中止,它会立即中止(因为地址正在使用)

#!/bin/sh

foo

if [ $? ]
then 
    # do something here if process failed
fi