일반적으로 저는 ps
Linux에서 이 명령을 사용하여 프로세스의 pid를 찾은 다음 해당 pid를 사용하여 프로세스를 종료한 다음 해당 특정 프로세스에 대한 특정 명령을 사용하여 프로세스를 다시 실행합니다.
내 질문은 - 단일 명령으로 프로세스를 어떻게 종료하고 다시 실행할 수 있습니까?
가능합니까?
답변1
PID를 얻은 다음 /prc/$pid/cmdline
파일을 읽어 시작하는 데 사용된 명령을 확인할 수 있습니다.
pid=123
com=$(perl -pe 's/\0/ /g' /proc/$pid/cmdline)
kill 123 && "$com"
따라서 이를 함수로 바꿀 수 있습니다.
restartPid(){
pid=$1
com=$(perl -pe 's/\0/ /g' /proc/"$pid"/cmdline)
kill 123 && "$com"
}
그러나 이는 특정 환경에서 명령을 실행하는 보다 복잡한 경우에는 작동하지 않습니다. 더 많은 생성을 시작하고 다음과 같은 환경을 포함하도록 확장할 수 있습니다.
restartPid(){
pid=$1
tempFile=$(mktemp)
perl -pe 's/\0/\n/g' /proc/"$pid"/environ |
perl -pe 's/^([^=]+)=(.*)/$1="$2"/' > "$tempFile"
read -r com args < <(perl -lne '@k=split(/\0/); print "$k[0] ", join " ", map "\"$_\"", @k[1..$#k]' /proc/"$pid"/cmdline)
dir=$(readlink -f "/proc/$pid/cwd")
kill $pid
( . \"$tempFile\"; cd "$dir"; eval $com $args )
}
그러나 보시다시피 이는 매우 복잡해지며 항상 작동한다고 보장할 수 없습니다. 하지만 좋은 시작이어야 합니다.