BASH ...... GNU并行

264*_*4nm 4 linux bash shell semaphore gnu-parallel

绞尽脑汁并抓取谷歌找到一种方法来获取sem带超时的命令选项,以便在超时时给我一个退出代码.它不需要通过sem,这只是一种痛苦,因为我需要根据是否最终采用不同的行动:

  • 我从被调用的脚本得到了一个OK响应

  • 从调用的脚本中我得到的东西都没问题

  • 通话超时

在这种情况下,信号量用于限制对脚本的调用,我将文件列表传递给传出消息队列.正如您在下面的粗略测试示例中所看到的,我能够处理前两个场景,但我不能为我的生活得到任何输出,我可以使用从超时终止的进程(即outputtest.sh有sleep 6; echo testings))

sem --jobs 3 --timeout 3 -u \
'runproc=$(bash outputtest.sh q_xxxx); if [ "$runproc" == "00" ]; 
then echo "OK"; else mv ./q_xxxx ./err/err_xxxx; fi'
Run Code Online (Sandbox Code Playgroud)

任何提示?

Ole*_*nge 5

GNU Parallel等待信号量可用,然后它分叉到后台并运行作业 - 如果超时则可能会将其删除.

因此sem,在作业完成之前和超时之前返回.因此sem无法告诉您作业是否会失败或在稍后的某个时间超时.

可能的解决方法是使用金丝雀,以便您可以查看作业是否完成:

rm canary
sem 'your_job; echo the job completed > canary'
Run Code Online (Sandbox Code Playgroud)

如果sem从不同的并行运行脚本启动,则--fg可能是您的解决方案:它将阻塞直到作业完成,如果作业失败/超时,则退出值为1,但其他并行运行的脚本将能够使用相同的信号.

另一种方法是--joblog从中读取退出值(超时会给出-1和15作为信号).但这并不适用sem,因此您必须重写您的程序才能使用parallel(不使用--semaphore).

要处理消息队列,您可能需要查看此消息:http: //www.gnu.org/software/parallel/man.html#example__gnu_parallel_as_queue_system_batch_manager