كيف يمكنني تعيين ulimit من داخل البرنامج النصي بيرل ينطبق على أطفالها؟

StackOverflow https://stackoverflow.com/questions/2226329

  •  19-09-2019
  •  | 
  •  

سؤال

لدي برنامج نصي بيرل يقوم بخطوات تثبيت مختلفة لإعداد صندوق تطوير لشركتنا. يعمل على تشغيل البرامج النصية شل مختلفة، بعضها تحطمها بسبب انخفاضها ulimitS (على وجه التحديد، حجم المكدس -s في حالتي).

لذلك، أود تعيين ulimit من شأنه أن ينطبق على جميع النصوص (children.

أنا أدرك أنني أستطيع الاتصال ulimit قبل أن أقوم بتشغيل البرنامج النصي PERL أو استخدام /etc/security/limits.conf لكنني لا أريد أن يعرف المستخدم أيا من هذا - يجب أن يعرفوا فقط كيفية تشغيل البرنامج النصي، والذي يجب أن يهتم بكل ذلك بالنسبة لهم.

يمكنني أيضا تشغيل ulimit في كل مرة أقوم بتشغيل أمر، مثل هذا ulimit -s BLA; ./cmd لكنني لا أريد تكرار هذا في كل مرة وأشعر أنني هناك حل أفضل، منظف هناك.

آخر مجنون "الحل البديل" هو جعل برنامج نصي غلاف يسمى Bla.Sh الذي من شأنه تعيين ulimit والاتصال Bla.pl، ولكن مرة أخرى، إنها اختراق في رأيي والآن لدي 2 نصوص (يمكنني حتى جعل Bla.pl استدعاء نفسها مع "ulimit -s bla؛ ./bla.pl --foo" وتتصرف بشكل مختلف بناء على ما إذا كان يرى - - ليس كذلك ولكن هذا هو الحلوى أكثر من ذي قبل).

أخيرا، من الواضح أنه يمكنني تثبيت BSD :: المورد ولكن أود تجنب استخدام التبعيات الخارجية.

إذا ماذا ال طريقة لتعيين ulimit من داخل البرنامج النصي بيرل وجعلها تنطبق على جميع الأطفال؟

شكرا لك.

هل كانت مفيدة؟

المحلول 4

انتهى بي الأمر بإعداد ulimit -s BLA إلى الأوامر التي تحتاجها. أنا على وجه التحديد لا أرغب في الذهاب مع BSD :: مورد لأنها ليست حزمة PERL الافتراضية وفقدت في حوالي نصف آلات Dev الحالية. لم يكن تفاعل المستخدم متطلبات محددة.

نصائح أخرى

لقد أجبت بالفعل سؤالك: استخدم BSD :: الموارد.

ليس هناك أي شيء في بيرل كور واجهات مع setrlimit. وبعد إذا لم تتمكن (أو لن) استخدم الطريقة القياسية، فعليك استخدام الاختراق. أي من الأساليب التي وصفتها بالفعل ستعمل. (لاحظ أنه يمكنك إنشاء روتين فرعي لإعداد ulimit -s BLA; إلى كل أمر، ثم استخدم هذا الفرعية بدلا من system.)

يمكنك دائما التفاف بيرل الخاص بك في برنامج نصي قذيفة قليلا:

#!/bin/sh -- # --*-Perl-*--
ulimit -n 2048
exec /usr/bin/perl -x -S $0 ${1+"$@"}
#!/usr/bin/perl
#line 6

use strict;

# etc, etc....

إنه قبيح، ومن الواضح أن وقت بدء البرنامج النصي سيكون لفترة أطول قليلا.

إليك مثال على كيفية تعيين حد وحدة المعالجة المركزية بدون استخدام BSD :: مورد (ولكن على افتراض أن رؤوس نظام بيرل هناك). للتكيف مع الموارد الأخرى، قم بإجراء التغييرات الواضحة.

require 'syscall.ph';
require 'sys/resource.ph';

# set the soft cpu limit to 1 (second), and the hard limit to 10.
$rstruct = pack "L!L!",1,10; # L! means native long unsigned int.
syscall(&SYS_setrlimit,&RLIMIT_CPU,$rstruct);

هذا يفترض معرفة أن rlim_t في الواقع منذ فترة طويلة؛ لا أعرف إذا كانت هناك طريقة لاستخراج هذه المعلومات من رؤوس بيرل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top