Linux에서 명령 실행을 직렬화하는 방법은 무엇입니까?

Linux에서 명령 실행을 직렬화하는 방법은 무엇입니까?

나는 시스템의 일반 사용자가 한 번에 하나의 스크립트만 실행할 수 있도록 하고 싶습니다. 여러 사용자가 로그인할 수 있으며 각 사용자는 다른 사용자가 실행한 명령이 완료된 후에만 명령을 실행할 수 있습니다.

오래 전, 저는 UNIX에서 batch스크립트 실행을 직렬화하기 위해 올바른 "단일 작업 전용" 대기열 정의와 함께 명령을 사용했습니다. 이는 많은 잠금 관리 문제를 해결합니다(스크립트에서 간단한 시간 초과 설정만 하면 됨).

이제 Linux에서는 batch명령이 다르게 실행되어 1분마다 하나의 작업을 실행하고 로드 평균 1.5에 도달할 때까지 작업이 병렬로 실행됩니다.

실행을 직렬화하기 위해 자체 잠금 관리 셸 라이브러리를 만들었지만 이를 수행하는 표준 명령이 있는지 궁금합니다.

답변1

flock정말 훌륭해요. 쉘 스크립트 주위의 래퍼에서 사용 하거나 flock, 명령줄에서 사용하거나, 스크립트 자체에 통합할 수 있습니다.

가장 좋은 점 flock은 기다릴 때 바쁜 루프에서 기다리지 않는다는 것입니다.

그것은 또한언제나프로세스가 종료/종료될 때 잠금을 해제합니다 flock.

프로세스가 정리되지 않고 종료되는 경우(또는 커널 패닉 또는 정전이 있는 경우...) 원자 파일/디렉토리 생성을 기반으로 하는 방법이 잠길 수 있습니다.

flockLinux 커널은 이를 사용하여 정리 작업을 수행합니다.

매뉴얼에서,

(
flock -s 200  
# ... commands executed under lock ...
) 200>/var/lock/mylockfile

이 형식에서는 특정 코드 블록을 셸 스크립트로 래핑합니다.

아니면 이렇게 실행할 수도 있습니다.

/usr/bin/flock /tmp/lockfile command

무기한 차단/대기를 원하지 않으면 시간 초과를 지정할 수 있습니다.

-w  --timeout <secs>     wait for a limited amount of time

아니면 그냥 비차단 매개변수를 사용하세요:

-n  --nonblock           fail rather than wait

답변2

아마도 당신이 원하는 것은 사용자가 실행할 수 있는 프로세스 수에 대한 엄격한 제한일까요? 쉘 프로세스와 기타 필요한 사항을 포함했는지 확인하세요.필요회의 중에 달리세요.

이는 /etc/security/limits.conf에 다음 행을 추가하여 설정할 수 있습니다.

testuser hard nproc 2

너무 많은 항목을 동시에 실행하려고 하면 포크할 수 없는 오류가 발생합니다. 필요에 맞게 2를 변경하고 제한하려는 사용자로 'testuser'를 변경합니다.

답변3

mkdir이를 원자 프로세스로 사용하여 다른 프로세스를 잠급니다. 그 당시에는 한 사람만이 디렉터리를 만들 수 있었습니다.

#!/bin/bash
if ! mkdir /tmp/TheLock 2> /dev/null ; then
    echo Error, user \'$(stat -c %U /tmp/TheLock)\' has the task
else
    echo Yes, I got it\!
    sleep 1 # do stuff
    rmdir /tmp/TheLock
fi

만약에먼저 스크립트를 실행하면 다음과 같이 표시됩니다.

Yes, I got it!

누군가가 동시에 실행하려고 하면 출력은 다음과 같습니다.

Error, user 'Emmanuel' has the task

관련 정보