cron을 사용하여 터미널에서 프로세스를 시작하고 싶습니다. 터미널에서 프로세스의 출력을 지속적으로 확인하고 종료/다시 시작 등을 할 수 있도록 프로세스가 터미널에서 시작되기를 원합니다. "screen -p -X stuff"를 사용하여 화면을 통해 이 작업을 수행할 수 있다는 것을 알고 있지만 최근에 화면이 멈추는 이상한 문제가 발생했습니다(화면 세션이 정지되고 출력이 중지되지만 프로세스는 계속 실행됩니다. 화면을 재활용할 수 있나요?) 화면을 사용하지 않고 터미널에서 cron을 통해 프로세스를 시작하는 방법이 있는지 궁금하십니까? 도움이 될 경우 터미널을 미리 생성하고 수동으로 이름을 바꿀 수 있습니다.
답변1
다음은 새로운 pty 설명자를 가져와 표준 출력 unlockpt()
에 쓰는 솔루션입니다 .ptsname()
<<\C cc -xc - -o pts
#include <stdio.h>
int main(int argc, char *argv[]) {
if(unlockpt(0)) return 2;
char *ptsname(int fd);
printf("%s\n",ptsname(0));
return argc - 1;
}
C
단지 작은 C 프로그램을 컴파일하고 unlockpt()
stdin 호출을 시도하며, 성공하면 새로 생성되고 잠금 해제된 pty의 이름을 인쇄하고, 그렇지 않으면 stdout
자동으로 2를 반환합니다.
Linux 시스템의 경우 - 적절한 권한 부여(일반적으로 그룹 에 자신을 추가하면 tty
가장 쉽게 달성할 수 있습니다.)- 새로운 pty 설명자를 쉽게 얻을 수 있습니다...
exec 3<>/dev/ptmx
./
...그리고 위 프로그램을 컴파일했다고 가정하고 현재 셸에서 메인 측 fd를 가져옵니다 .
slave=$(./pts <&3)
...새 설명자를 실제로 사용할 수 있게 만들고 해당 장치 이름을 쉘 변수 값에 넣습니다 $slave
.
다음으로 제공util_linux
패키지가 시스템에 설치되면 setsid()
거기에 새 프로세스를 설치할 수 있습니다. 예를 들면 다음과 같습니다.
setsid -c sh 3>&- <>"$slave" >&0 2>&1
대화형 프로세스를 시작 sh
하고 pty의 세션 리더로 종료되며 기본적으로 대화형 셸의 배경 역할을 합니다. 배경 쉘은 >&3
사용자 입력으로 작성된 모든 것을 해석합니다. 특히 유용한 것을 작성하는 것은 다음과 같습니다:
echo "exec >$(tty) 2>&1" |
cat - /dev/tty >&3
일시적으로 배경 셸과 해당 하위 항목의 모든 출력을 현재 터미널로 리디렉션하는 동시에 모든 키보드 입력이 존재하는 한 다시 배경 셸로 리디렉션합니다 cat
. 그러나 /dev/tty
슬레이브에서는 배경 쉘이 pty이므로 다음과 같이 현상 유지가 쉽습니다.
echo 'exec >/dev/tty 2>&1' >&3
에서도 동일한 작업을 수행할 수 있지만 cron
물론 I/O를 스크립팅하거나 일부 파이프 릴레이를 설정하여 자동으로 수행할 수도 있습니다.
바라보다이 pty를 어떻게 구하고 어떻게 할 수 있나요?더 알아보기.