Article 3795 of fj.sys.sun: Path: news2.sra.co.jp!katsu From: katsu@sra.CO.JP (WATANABE Katsuhiro) Newsgroups: fj.sys.sun Subject: Re: [Q]about limit command Supersedes: Date: 07 Oct 1998 01:00:20 GMT Organization: Software Research Associates, Inc., Japan Lines: 88 Message-ID: <6veob4$l5r$1@sranhh.sra.co.jp> References: <31F6D461.5BEF.003@people.or.jp> NNTP-Posting-Host: sras49.sra.co.jp In-reply-to: Watanabe, Nama's message of 25 Jul 1996 01:56:51 GMT Originator: katsu@sras49 Xref: news2.sra.co.jp fj.sys.sun:3795 あまりのフォローの遅さが議論の妨げになっていたらごめんなさい。 投稿時に化けた を supersedes します。 記事 <31F6D461.5BEF.003@people.or.jp> で、 41948222@people.or.jp (Watanabe, Nama) さんいはく > とある事情から一般ユ−ザの資源を制限するために、 > limitコマンドを使って、いわゆる「強い制限値」をか > けようとしたのですが、以下のようなエラ−が出て失敗して > しまいました。 > SUN % limit cputime > cputime unlimited > > SUN % limit -h cputime 1000 > limit: cputime: Can't set hard limit > SUN % limit cputime > cputime unlimited > 小生、sunには不慣れで、比較的なじみのIRIX5.2 > IRIX5.2では、以下のようにうまくいっていたので、不思議です。 > IRIS %limit cputime > cputime unlimited > > IRIS %limit -h cputime 1000 > IRIS %limit cputime > cputime 16:40 > > OSは、SunOS5.5です。いわゆるSolarisのこと > と思って使っているのですが、違うのかな?? 結論を言うと、SunOS [45].X の csh では、soft(current) limit より 小さい値に hard limit を設定できません。 % limit cputime ... % limit -h cputime ... のような順序にすればよいでしょう。これは、setrlimit(2) の仕様の せいと思われます。 setrlimit(2)で、hard limit < soft limit のような指定をした場合の ふるまいはOSに依存していて ・失敗する [System V 系, SunOS [45].X] ・そのままの値を設定する [NeXT Mach, Linux, 4.3BSD 系] ・soft limit も hard limitにあわせてしまう [4.4BSD 系] 等が混在してます。察するに IRIX は FreeBSD と同じ流儀なのでしょう。 > (上の例では、suではない一般ユ−ザが、自分で自分に制限 > をかけるような記述になっていますが、これは起動時に自動 > 実行するスクリプト中にでも置こうか、と思っているので・・・) limit は、実はシェルの組み込みコマンドです。そうなっている理由は、 setenv や cd の場合と同じです。外部コマンドにしたら、そのコマンドが exit(2) したときに無に帰されてしまいますから。よって、スクリプトを 書くときには、プロセスの親子関係を考えることが重要になるでしょう。 例えば、単に /etc/rc*, /etc/rc[23].d などのどこかに ulimit -H -t ... などと書いたとしても(注1)、その効果は(cd や setenv と同様に)、 その rc ファイルとそこから execve(2) されるプロセスに局所的です。 注1: OS によっては、sh にそもそも ulimit がないこともあります。 元記事の SunOS 5.x にはあるでしょう。 単一の your_command (とその子プロセス群)だけに limit を設定したい (かつソースに手を入れられない)ならば、 #!/bin/csh -f limit -h .... exec your_command のような wrapper を作ることになると思います。 file descriptor などの limit を /etc/system(4) 等を通じてシステム 全域的に設定することはしばしば行われます。しかし、cputime の場合は limit を全域的に設定する方法はなさそうで、たとえ可能だったとしても 危険でしょう。何故なら、init(8) や inetd(8) が影響を受けますから。 「一般ユ−ザの資源を制限する」(cputime を制限する)のは、結局は 完全な解が得られず、どこかに穴が残るものと私は踏んでいます。その 論拠も2点挙げておきます。 1. 一般ユーザのプロセスの親や前身になって limit が継承される 可能性のあるコマンドは、かなりの多種に渡る。例えば、getty, xdm 関係, in.rlogind, in.telnetd, in.rshd, in.rexecd, atrun, uuxqt, sendmai(~/.forward) ...等。見落としの可能性もあるし、 ここに挙げたものの中だけでさえ、上記の wrapper のような 自明な解決が適用できないものがある。 2. 真正面から signal(SIGXCPU, SIG_IGN) することは、常に可能。 -- 渡邊克宏@SRA