제어 터미널과의 연결을 끊는 명령/스크립트를 호출하시겠습니까?

제어 터미널과의 연결을 끊는 명령/스크립트를 호출하시겠습니까?

저는 일반적으로 자동화된 프로세스(예: cron, Jenkins)로 실행되는 스크립트의 동작을 연구하고 있습니다. 대화형으로 실행될 때 스크립트는 (결국) 다르게 동작하는 명령을 호출할 수 있습니다(예를 들어, patch역방향 패치로 무엇을 해야 하는지 묻고 svn비밀번호를 묻습니다. 그러나 다음과 같은 경우 어떤 일이 발생하는지 확인해야 합니다. 비대화형으로 실행됩니다.

patch비대화형으로 설득하는 것은 상당히 쉬웠습니다. 단지 stdout비-tty로 리디렉션하면 되었습니다.

$ </dev/null > >(cat) /path/to/myscript --args

그러나 svn존재하는 경우 제어 터미널에 연결합니다. 전달할 스크립트를 편집하는 --non-interactive것은 여러 수준에서 이루어지고 각 호출을 찾았는지 알기 어렵기 때문에 실제로는 옵션이 아닙니다.

제어 터미널 없이 스크립트/명령을 비대화식으로 호출하는 방법이 있습니까(그래서 /dev/tty존재하지 않습니까)? 나는 stdout/stderr이 여전히 내 터미널로 가는 것을 선호합니다.

(이 질문을 찾았습니다.비대화형 쉘에서 스크립트를 실행하시겠습니까?그러나 대답은 cron과 사용자 환경의 차이점에 대해 설명합니다. 상호 작용을 제외한 모든 차이점을 제거했습니다. )

답변1

터미널에 연결되지 않은 다른 세션을 시작해야 합니다. 예를 들면 다음과 같습니다.

$ setsid sh -c 'tty; ps -jp "$$"; echo test' < /dev/null > log 2>&1
$ cat log
not a tty
  PID  PGID   SID TTY          TIME CMD
19506 19506 19506 ?        00:00:00 sh
test

start-stop-daemon일부 Linux 배포판의 명령 도 참조하세요 . 아직 하나 있어요daemon주문하다.

답변2

Expect 스크립트를 실행하고 싶을 수도 있습니다. SVN 예:

https://stackoverflow.com/questions/609445/using-expect-to-login-into-svn

답변3

때로는 표준 입력을 열어 두어야 합니다(표준 입력에서 eof를 수신하지 않음)(예: 기대). 이 경우 /dev/null을 /dev/zero로 변경합니다.

setsid sh -c 'make test' </dev/zero >log 2>&1

관련 정보