web-dev-qa-db-ja.com

ユーザーがプロセスをネガティブな良さよりも優先できるようにするにはどうすればよいですか?

ユーザーに、Nice値が負の値でシステム上で特定のプロセスを実行してもらいたい。この特定のプログラムはminecraftサーバーであり、サーバーの制御はコマンドラインに依存しているため、プロセスを単純にバックグラウンドに分岐することはできません。

私の現在のbashスクリプトは次のようになります(重要な部分):

sleep 10 && \
Sudo renice -n $NICENESS $(ps -u $(id -u) -o "%p:%c" | sed -n "s/:Java$//p") & \
Java -Xmx8G -Xms2G -jar minecraft_server.jar nogui    

sleepは単にreniceの実行を遅らせます。 renice自体はpsを使用して、ユーザー自身のIDを使用してJavaプロセスをチェックします。Java =異なるユーザーの下でスポーンしますが、minecraftサーバーは独自のユーザーの下で実行されますminecraft

サーバーを起動するたびにパスワードを入力したくないのは明らかです。
from / etc/sudoers

minecraft ALL = NOPASSWD: /etc/renice

これを行うよりエレガントな方法はありますか?単にNiceを使用することはオプションではありません。Sudo Nice bashNOPASSWD:オプションと組み合わせると、セキュリティ上の大きな問題になります。

12
Baarn

Pam_limits.soモジュールはそこであなたを助けることができます。

これにより、特定の個々のユーザーとグループ、ワイルドカード、またはユーザーとグループの範囲に特定の制限を設定できます。

設定できる制限は通常、ulimit設定ですが、同時ログインセッションの数、プロセス、CPU時間、デフォルトの優先度、および最大の優先度(renice)にも制限があります。詳細については、limits.confのmanページを確認してください。

たとえば、すべてのプロセスをデフォルトの優先度を上げて開始するようにマインドクラフトグループを設定し、優先度を下げるだけでなく、Niceおよびreniceコマンドを使用して、重要なジョブの優先度を手動で上げることができます。

# /etc/security/limits.conf
# increase default and max prio for members of the mindcraft group
@mindcraft   hard priority -10
@mindcraft   hard Nice     -18   
9
HBruijn

reniceなしでSudoを使用することは不可能です。 renice(1) manページから引用します:

スーパーユーザー以外のユーザーは、自分が所有するプロセスの優先度のみを変更でき、Niceリソース制限がない限り、(セキュリティ上の理由から) `` Nice値 ''を0からPRIO_MAX(20)の範囲内で単調にしか増加できませんセット(Linux 2.6.12以降)。

1
Joseph R.