5

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

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

  • 我从被调用的脚本中得到什么,但没问题

  • 通话超时

在这种情况下,信号量用于限制对脚本的调用,我将文件名列表传递给传出消息队列。正如您在下面的粗略测试示例中看到的那样,我能够处理前两种情况,但我无法在我的一生中得到任何输出,我可以从因超时终止的进程中使用(即outputtest.shsleep 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'

有什么提示吗?

4

1 回答 1

6

GNU Parallel 一直等到信号量可用,然后分叉到后台运行作业——如果超时,可能会杀死它。

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

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

rm canary
sem 'your_job; echo the job completed > canary'

如果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

于 2014-03-15T18:05:02.310 回答