프로그램은 사용자 아래에서는 중지되지만 루트에서는 실행됩니다.

프로그램은 사용자 아래에서는 중지되지만 루트에서는 실행됩니다.

나는 R일반 사용자로 작업을 실행하고 있습니다 john. root흥미롭게도 프로그램은 사용자 아래에서 중지되지만 을 사용할 john때 ,rootstrace나는 찾았다john을 실행 하면 R프로세스가 하위 프로세스를 중지합니다. 내 생각에 Linux는 하위 프로세스가 계속 실행되도록 허용하지 않으며 상위 프로세스(주 프로그램)는 무기한 정지될 것입니다. 일반 Linux 사용자가 수행할 수 있는 포크/클론 수에 제한이 있습니까? 왜 이런 일이 발생하는지 아시나요?

아무튼 여기야이 게시물내 문제의 시작점을 설명했습니다.

추가 정보

stracefor 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 ...>

stracefor의 마지막 몇 줄 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 RR을 따르기 위해그리고모든 하위 프로세스에도 동일하게 적용됩니다. 이는 서브루틴이 정지되는 정확한 위치를 표시해야 합니다.

확인해야 할 몇 가지 추가 사항은 다음과 같습니다.

루트( 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?

관련 정보