프로그램의 1개 인스턴스를 프로세스로 실행하는 방법은 무엇입니까? 아니면 실행 중인 프로그램이 존재하는지 테스트하는 방법은 무엇입니까?
휴대용 방법이 선호됩니다.
답변1
(이름이 지정된) 파이프의 쓰기 가능성을 테스트하고 적절한 프로그래밍을 사용하여 실행 중인 프로그램 인스턴스의 존재 여부를 테스트할 수 있습니다.
파일 이름을 /tmp/fifo-myapp
FIFO 파일의 이름으로 예약한다고 가정합니다(각각의 애플리케이션에 대해 사용자 정의해야 하며 일반적으로 일부 애플리케이션별 폴더에 있으며 절대 경로로 지정됨).
파일 1:test-wr-fifo
#!/bin/sh
# invocation: test-wr-fifo <timeout>
timeout="${1:=3}"
if ! [ -p "/tmp/fifo-myapp" ] ; then
rm -f "/tmp/fifo-myapp"
mkfifo "/tmp/fifo-myapp"
fi
{ sleep "$timeout" ; kill -s 0 $$ && kill -s TERM $$ ; } &
exec 3>"/tmp/fifo-myapp"
fifo가 열려 있지 않고 지정된 시간 초과에 도달하면 프로그램이 실패 상태로 종료됩니다.
파일 2:single-inst-prog
#!/bin/sh
exec 3<"/tmp/fifo-myapp"
### Application Code ###
이것은 인스턴스가 1개만 필요한 프로그램입니다.
옮기다 single-inst-prog
:
./test-wr-fifo || ./single-inst-prog &
이는 FIFO 블록의 한쪽 끝을 열 때까지(O_NONBLOCK이 지워진 경우) 다른 쪽 끝도 열리기 때문에 작동합니다. FIFO에서 데이터를 읽거나 쓰지 않기 때문에 작동하므로 EOF 조건과 SIGPIPE는 절대 작동하지 않습니다. 신호를 보냈습니다.
답변2
mv
나는 파일 잠금 시 경쟁 조건을 항상 경계하므로 원자적이기 때문에 특별히 이름이 지정된 파일을 사용합니다 .
일반적으로 프로세스는 영구 파일 이름을 사용합니다(예 /tmp/locks/myProcess.lock
: 잠금을 획득하려는 모든 프로세스는 이름을 ( 셸 및 C /tmp/locks/myProcess.lock.myPID
에서 사용됨 )으로 변경하려고 시도합니다. 그런 다음 개인 이름이 현재 존재하는지 확인할 수 있습니다. 그렇지 않은 경우 필요에 따라 루프/휴면 상태가 됩니다.mv(1)
rename(2)
주의를 기울이면 프로세스는 잠금 파일에 로그를 추가할 수 있습니다(잠금이 처음 시도된 시간, 성공한 시간 및 해제된 시간).
물론 성공 후에만 로그를 기록할 수 있으므로 첫 번째 시도 시간을 기억해야 합니다. 또한 과도한 대기 시간을 모니터링하고 조사 경고를 발생시킬 수 있습니다(다른 프로세스 복사가 실패했고 잠금을 해제할 onExit가 없었을 수도 있음).
답변3
이것은 xmessage의 예입니다. 이것이 당신에게 효과가 있을지 확실하지 않지만 시도해 볼 수 있습니다.
#!/bin/sh
xmessage 'hello this is the first xmessage' &
last=$(ps -a | grep '[ ]xmessage$' | awk '{print $1}')
sleep 1
if test $(($(date +%s) % 2)) -eq 0
then
kill $last
fi
sleep 1
if ! ps -p $last >/dev/null
then
xmessage 'Hi, this is the second xmessage. Visible only if the first is close!' &
fi