私はR
通常のユーザーとしてタスクを実行していますjohn
。root
興味深いことに、プログラムはユーザーの下で停止しますが、使用するjohn
と、root
strace
私は見つけたjohn
を実行すると、R
プロセスは子プロセスを停止します。私の考えでは、Linuxは子プロセスを実行し続けることができず、親プロセス(メインプログラム)は無期限に停止します。一般的なLinuxユーザーが実行できるフォーク/クローンの数に制限はありますか?なぜこれが起こるのかご存知ですか?
とにかくここです。この投稿私の問題の始点を説明しました。
追加情報
strace
for userの最後の数行john
(プログラムが停止する場所):
lseek(255, -82, SEEK_CUR) = 1746
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fa12fd4f9d0) = 13302
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {0x43d060, [], SA_RESTORER, 0x311b432900}, {0x452250, [], SA_RESTORER, 0x311b432900}, 8) = 0
wait4(-1, <unfinished ...>
strace
forの最後の数行root
(プログラムが完全に実行される場所):
lseek(255, -82, SEEK_CUR) = 1746
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f81d8e239d0) = 13244
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {0x43d060, [], SA_RESTORER, 0x311b432900}, {0x452250, [], SA_RESTORER, 0x311b432900}, 8) = 0
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 13244
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
wait4(-1, 0x7fff54a591dc, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn(0xffffffffffffffff) = 0
rt_sigaction(SIGINT, {0x452250, [], SA_RESTORER, 0x311b432900}, {0x43d060, [], SA_RESTORER, 0x311b432900}, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(255, "\n### Local Variables: ***\n### mo"..., 1828) = 82
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(255, "", 1828) = 0
exit_group(1)
答え1
strace -f R
Rに従うためにそしてすべてのサブプロセスにも同様に適用されます。これは、サブルーチンが停止する正確な位置を示す必要があります。
確認する必要があるいくつかの追加事項は次のとおりです。
root(su - root
)とユーザーjohnで次の出力を比較します。
ulimit -a #will show all the "limits" set for that user. You may reach one of them?
set ; env #maybe john & root don't have same PATH or some other thing changes (LD_LIBRARY_PATH? or another?)
grep $(whoami) /etc/passwd /etc/group #see if john maybe needs to be in some group?