여기에 실행 중인 스크립트의 다른 인스턴스가 있는 경우 스크립트에서 종료되는 멋진 작은 코드가 있습니다.
single_instance(){
if pidof -x "${0##*/}" -o %PPID >/dev/null; then
exit 0
fi
}
그런데 내가 찾고 있는 것은 스크립트가 실행될 때만 종료되는 함수입니다.동일한 매개변수로 호출됨.
솔루션 을 통해 해킹할 수 있다는 cat | grep | awk | cut | sed | tac | sort | uniq
것을 알고 있지만 .pidof
ps
당신은 무엇을 하시겠습니까?
답변1
다음을 수행할 수 있습니다.
#!/bin/bash
single_instance() {
pid=$(pidof -x "${0##*/}" -o %PPID)
if [[ $(xargs -0 < /proc/$pid/cmdline) == $@ ]]
then
echo QUITTING
exit 1
fi
}
single_instance $(xargs -0 < /proc/$$/cmdline)
while :
do
sleep 10
done
답변2
man ps
@goldilocks에서 일부 코드를 조사하고 추가한 후에 이것을 생각해 냈습니다. 공백이 있는 인수를 잘 처리하고 스크립트가 다음과 같이 호출되는 경우 bash scriptname
:
single_instance(){
if ps -efww | grep "$(ps -o cmd= -p $$)$" | grep -vq " $$ "; then
exit 0
fi
}
답변3
fn() { IFS='
'; set -- $(ps -o args= -C "${0##*/}")
unset IFS
[ $(($(printf $(printf %s\\n "$@" | sort | uniq -c | sort -rn)))) -gt 1 ] &&
exit 0
}
exit 0
동일한 인수로 호출된 두 개 이상의 프로세스가 현재 실행 중인 경우 $0
이러한 현상이 발생할 수 있습니다 .
답변4
사용/프로세스:
single_instance(){
local tl=$(cat /proc/$$/cmdline)
local l
tl=${tl##*/}
for pid in $(pidof -x "${0##*/}" -o %%PPID); do
l=$(cat /proc/$pid/cmdline)
if [ ${l##*/} = $tl ]; then
echo "already running..."
exit 0
fi
done
}
실행 경로 없이 명령줄을 정확하게 비교합니다(스크립트에서와 마찬가지로). 이 /proc/*/cmdline
값에는 공백이 없으므로 직접 비교할 수 있습니다. 인수 순서가 변경되는지는 알 수 없습니다.