제어 터미널에서 연결이 끊긴 명령 / 스크립트를 호출 하시겠습니까?


9

일반적으로 자동화 된 프로세스 (예 : cron, Jenkins)로 실행되는 스크립트의 동작을 조사하고 있습니다. 스크립트는 대화식으로 실행될 때 다르게 동작하는 (사용자 입력을 찾는) 명령을 (최종적으로) 호출 할 수 있습니다. 예를 들어, patch리버스 패치로 무엇을해야하는지, svn암호를 요구할 것이지만, 비 대화식으로 실행될 때 어떤 일이 발생하는지 확인해야합니다.

patch비 대화식이라고 설득 하는 것은 매우 쉽습니다. stdouttty가 아닌 것으로 리디렉션해야합니다 .

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

그러나 svn제어 터미널이 있으면 연결합니다. 전달할 스크립트를 편집하는 --non-interactive것은 실제로 여러 수준에서 나오므로 모든 호출을 찾은 것이 확실하지 않으므로 실제로는 옵션이 아닙니다.

제어 터미널없이 /dev/tty존재하지 않는 스크립트 / 명령을 비 대화식으로 호출하는 방법이 있습니까? stdout / stderr를 여전히 내 터미널로 이동하고 싶습니다.

( 대화식이 아닌 쉘에서 Run script 라는 질문을 찾았 지만 이에 대한 대답은 cron과 사용자 환경의 차이점에 대해 설명합니다. 비 대화식을 제외한 모든 차이점을 이미 제거했습니다.)

답변:


13

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

$ 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명령.


이 결과는 무엇을 의미합니까? 매우 비밀스러워 보입니다.
anatoly techtonik

2
@anatolytechtonik 중요한 부분은 "tty tty가 아님"이며 stdin에 터미널이 없음 을 확인한 결과이며 "?" TTY의 열에 ps확인 출력 전혀 없다 제어 TTY 위한 sh프로세스 (아무것도 실행은 그 아래).
mr.spuratic

다른 명령과 마찬가지로 명령을 실행하려면을 사용하십시오 setsid -w. 예 : setsid -w sh -c 'tty < /dev/tty'제공합니다 sh: 1: cannot open /dev/tty: No such device or address(참고 : /dev/tty제어 tty입니다). -wsetsid가 없으면 프로세스가 병렬 / 백그라운드로 실행됩니다.
Tino

0

당신은 아마 스크립트를 기대하고 싶을 것입니다. SVN의 예 :

/programming/609445/using-expect-to-login-into-svn


작동하지 않습니다. 대화식으로 명령을 실행합니다.
ecatmur

어떤 의미에서 대화식으로? 사용자의 입력이 필요하다는 의미에서? 그것이 당신이 의미하는 바라면, 그 경우 기존에 기대할만한 점이 많지 않을 것입니다. 내가 사용하는 한 가지 예는 passwd 명령에 --stdin 옵션이 없으므로 Solaris의 경우 passwd를 감싸서 계정의 임의 암호를 제공하는 expect 스크립트를 실행하는 cronjob이 설정되어 있습니다. 인간의 상호 작용이 필요하지 않습니다. 이것이 사용자의 요구 사항이라는 것을 이해하고 있습니다. 그래도 오해했을 수 있습니다.
Bratchley

사실, 내가 이것을 더 많이 읽을수록, 당신이 뭘했는지 오해했음을 깨닫게됩니다. 사과.
Bratchley

0

때로는 stdin을 열어 두어야합니다 (stdin에서 eof를받지 않음) (예 : 예상). 이 경우 / dev / null을 / dev / zero로 변경하십시오.

setsid sh -c 'make test' </dev/zero >log 2>&1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.