일부 데이터를 복구하기 위해 일부 유틸리티를 처리하도록 설계된 스크립트를 실행하고 있습니다. 스크립트는 사용자가 복원해야 하는 파일을 저장할 수 있는 디렉터리에 있습니다. 이 디렉토리에는 많은 사용자가 접근하여 스크립트를 실행할 수 있으므로, 이미 스크립트가 실행 중인지 확인하는 조건을 갖고 싶습니다. 그렇다면 "나중에 다시 시도하세요" 메시지를 출력하세요. 그렇지 않으면 평소처럼 실행하세요.
나는 여기서 몇 가지 조사를 했고 이것이 위에서 언급한 내 기능에 대한 작동 코드라고 생각했습니다.
#!/bin/bash
me="$(basename "$0")";
running=$(ps h -C "$me" | grep -wv $$ | wc -l);
[[ $running > 1 ]] && exit;
나는 이 기능과 위의 코드를 Solaris SunOS 5.8에서 구현하고 싶습니다. 나는 ps가 Unix와 Linux에서 다르게 작동한다는 것을 알고 있습니다.
답변1
사용중인 ps 명령은 UNIX와 관련이 없습니다.
"대신"은 BSD에서 사용되었지만 key letters
표준에는 포함되지 않았습니다. BSD는 생각보다 다른 방식으로 키 문자를 사용합니다.options
ps
h
나는 다음을 사용하는 것이 좋습니다:
ps -p $$
이 스크립트의 인스턴스가 더 있는지 확인하려면 다음을 사용하세요.
myname=`basename $0`
pids=`pgrep -d, $myname`
ps -p $pids
이론적으로는 다시 실행할 필요도 없으며 ps
출력에서 쉼표가 있는지 확인하는 것만으로도 충분합니다.pgrep
파일 잠금 알고리즘을 구현하고 POSIX 호환 셸을 갖고 싶다면 다음을 사용할 수 있습니다.
set -o noclobber
:> /var/tmp/myscript
if [ $? -ne 0 ]; then
echo already running
exit 1
fi
... do some stuff
rm /var/tmp/myscript
이것이 안정적으로 작동하는지 여부는 쉘이 POSIX가 선호하는 방식으로 noclobber를 구현하는지 여부에 따라 달라집니다. 일부 쉘은 이 작업을 자동으로 수행하지 않을 수 있으므로 자신의 쉘이 제대로 작동하는지 알아야 합니다.