백그라운드 프로세스의 표준에 쓰기


25

우분투 10.04 상자에 있고 ssh를 통해 백그라운드에서 서버 (myserver &)를 시작했습니다. 서버가 제대로 실행되고 있지만 서버를 제어하는 ​​유일한 방법은이 방법을 사용하는 것이므로 서버의 표준에 도달하는 방법이 필요합니다.

이미 실행중인 프로세스의 표준에 도달 할 수있는 방법이 있습니까? 분명히, 지금이 작업을 수행하려면 FIFO를 stdin으로 리디렉션하여 시작하지만 불행히도 지금은 조금 늦었습니다.

어떤 아이디어?


그냥 다시 전경으로 가져올 수 없습니까? ( 'jobs'는 현재 백그라운드 프로세스를 나열하고 'fg $ X'는 작업을 다시 포 그라운드로 가져오고 Ctrl + b는 작업을 일시 중지하고 쉘로 돌아갑니다. 'bg'는 일시 중지 된 프로세스를 계속합니다. 배경)
symcbean

답변:


10

/ proc pid 디렉토리에 쓸 수 있습니다. 데몬의 pid가 2000이라고 가정하고 / proc / 2000 / fd / 0에 쓰십시오.


고마워 ... 나는 이것을 게시 한 직후 (보통 하루를 보낸 후)를 발견했다. 실제로 데이터를 프로그램에 보내는 한 작동하는 것 같습니다. 불행히도, 프로그램은 명령을 받아들이지 않습니다. 로컬 컴퓨터에서 서버를 실행하여 테스트 한 결과 데이터가 표시되지만 프로그램이 명령을 인식하지 못합니다. 서버 터미널에서 Enter 키를 수동으로 눌러야 만 인식 할 수없는 명령이 표시됩니다. 어쩌면 자바 이상한가? 나는 붙어있다 ...
tajmorton

1
echo -e "something \ n"> / proc / 2000 / fd / 0는 어떻습니까?
katriel

실제로 일부 시스템에서는 / proc / <pid> / fd / 0이 / dev / pts <some number>를 가리 키기 때문에 항상 작동하지 않습니다 ...
bk138

serverfault.com/questions/178457/에 대한 첫 번째 답변 은이 방법이 실제로 작동하지 않는다는 것입니다.
barrycarter

2
실제로 작동하지 않습니다. 일반적으로 쉘 (파이프 또는 경로 재 지정이 사용되지 않는 경우)은 동일한 파일로 설정되는 파일 디스크립터 0를 사용하여 명령을 시작합니다 . 이 명령은 다음 읽고 FD에서 와 기록 FD로 하고 (예를 들어, 터미널 에뮬레이터 SSH를 통해 또는 직접) 가상 터미널과 통신합니다. 다른 프로세스 (예를 통해 해당 파일에 액세스하는 경우 ) 정확히 같은 일이 발생, 즉 쓰기 그것에는 터미널이 아닌 명령에 기록합니다. 2/dev/pty/...012/proc
Feuermurmel

29

명명 된 파이프 (fifo)를 입력으로 서버를 시작할 수 있습니다.

mkfifo /tmp/srv-input
cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid
cat /tmp/srv-input | myserver &

cat > /tmp/srv-input &서버가 EOF를받지 않도록 하는 것이 중요합니다. 서버가 EOF를받지 못하도록 최소한 하나의 프로세스에 fifo가 서면으로 열려 있어야합니다. 이 명령의 PID는 후행 종료를 위해 /tmp/srv-input-cat-pid파일에 저장됩니다 .

서버를 이미 시작한 경우 gdb프로세스에 연결하는 것과 같은 디버거를 사용하여 서버 stdin를 fifo 로 리디렉션 해야합니다.

gdb -p PID
call close(0)
call open(0, "/tmp/srv-input", 0600)

그런 다음 다음과 같이 서버에 입력을 보내십시오 (필요한 경우 다른 터미널 창에서).

echo "command" > /tmp/srv-input

서버에 EOF를 보내려면에 cat > /tmp/srv-inputPID가 저장된 프로세스를 종료 해야 합니다 /tmp/srv-input-cat-pid file.

GDB의 경우 GDB를 종료하면 EOF가 전송됩니다.


1
/ proc / 2000 / fd / 0이 모든 시스템에 표시되지 않기 때문에 이것은 @katriel의 접근 방식보다 훨씬 이식성이 뛰어납니다.
Prior99

"cat> / tmp / srv-input &"의 트릭으로 인해 두통이 발생했습니다. 고맙습니다!
Prior99

무엇에 대해 mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &? 이렇게하면 파이프가 열린 상태로 유지됩니다.
bk138

@ bk138 : 꼬리가 작동 해야하는 것처럼 보이지만 확실하게 알 수있는 방법은 테스트입니다.
jfg956

tail작동하지 않지만 작업을 완료하기 위해 이것을 추가했습니다 : cat /tmp/srv-input | myserver; kill -9 cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat *`
Thiago Macedo

4

위와 동일하지만 '고양이'가 작동하지 않았습니다. 파일에 EOF가 있고 하나의 명령을 보낸 후 종료되었습니다.

이것은 나를 위해 일했다 :

#!/bin/bash

mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.