백그라운드에서 계속 실행하고 싶은 스크립트가 있는데 어디서 시작해야 할지 모르겠습니다.
이것을 에 넣으면 .bashrc
여러 번 실행됩니다(로그인할 때마다 한 번씩).
이것은 사용자가 로그인한 동안 실행하고 싶지만 사용자당 여러 번 실행하고 싶지 않은 무한 루프입니다.
답변1
스크립트는 인스턴스가 하나만 있는지 확인해야 합니다. 다음과 같이 시도해 보세요.
#!/bin/bash
mkdir ~/.lock_script || exit
trap "rmdir ~/.lock_script" EXIT
while true
do
# Do whatever the script does continuously, here....
#
done
이 trap
명령은 종료 시 정리를 담당하므로 스크립트가 종료되거나 종료되더라도 정리됩니다. 어떤 프로세스도 TERM 신호(신호 9)를 트랩(캐치)할 수 없으므로 kill -9
스크립트를 실행하면 자체적으로 정리되지 않습니다.
커널에 관한 한 mkdir은 원자적 작업입니다. mkdir이 성공하지 못한 경우(예: 디렉터리가 이미 존재하는 경우) 명령은 오류를 반환하며 이로 인해 명령의 후반부가 실행됩니다(예: 종료).
명령을 "mkdir or else exit"로 읽을 수 있습니다. 여기에 더 나은 설명이 있습니다.http://initialprogramload.blogspot.com/2008/11/single-script-instance.html
또한 이 방법은 사용하지 않는 것이 좋습니다. while true
가능하다면 원하는 작업을 수행하는 다른 방법을 찾아보세요.
답변2
bash(1)
로그인 셸로 실행하는 경우 (즉, 사용자가 로그인하는 경우) 를 사용하여 호출하지 않는 한 /etc/profile
, ~/.bash_profile
및 ~/.bash_login
가 실행됩니다 . 거기에서 스크립트가 트릭을 수행해야 합니다.~/.profile
--no-profile
답변3
다음과 같이 조건을 하나 더 추가할 수 있습니다.
가입하다.bashrc
export my_script_pid=myscript.${USER}
[[ ! -f $my_script_pid ]] && { touch $my_script_pid; echo run-script; } || echo "script already running"
그런 다음 스크립트에 마지막으로 추가하십시오 rm $my_script_pid
.
답변4
스크립트를 실행하고 다음에서 로그를 가져올 수 있습니다.
nohup /path/to/your/script.sh > /dev/null 2>&1 &
또한 출력을 제공합니다.