현상
에어플로우 웹 서버나 스케쥴러를 백그라운드로 실행했다.
airflow scheduler -D
airflow webserver --port 8081 -D
하지만 웹에서 접속이 되지 않아 확인했더니 스케쥴러의 프로세스가 존재하지 않았다.
원인
웹 서버와 스케쥴러의 에러 로그를 확인해보니 두 요소 모두 아래와 같은 FileExistsError, lockfile.AlreadyLocked가 발생하고 있었다.
$ view airflow/airflow-webserver.err
Traceback (most recent call last):
File "/home/airflow1/venv/airflow/lib/python3.8/site-packages/lockfile/pidlockfile.py", line 77, in acquire
write_pid_to_pidfile(self.path)
File "/home/airflow1/venv/airflow/lib/python3.8/site-packages/lockfile/pidlockfile.py", line 161, in write_pid_to_pidfile
pidfile_fd = os.open(pidfile_path, open_flags, open_mode)
FileExistsError: [Errno 17] File exists: '/home/airflow1/airflow/airflow-webserver-monitor.pid'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/airflow1/venv/airflow/bin/airflow", line 37, in <module>
args.func(args)
File "/home/airflow1/venv/airflow/lib/python3.8/site-packages/airflow/utils/cli.py", line 80, in wrapper
return f(*args, **kwargs)
File "/home/airflow1/venv/airflow/lib/python3.8/site-packages/airflow/bin/cli.py", line 1158, in webserver
with ctx:
File "/home/airflow1/venv/airflow/lib/python3.8/site-packages/daemon/daemon.py", line 389, in __enter__
self.open()
File "/home/airflow1/venv/airflow/lib/python3.8/site-packages/daemon/daemon.py", line 381, in open
self.pidfile.__enter__()
File "/home/airflow1/venv/airflow/lib/python3.8/site-packages/lockfile/__init__.py", line 197, in __enter__
self.acquire()
File "/home/airflow1/venv/airflow/lib/python3.8/site-packages/daemon/pidfile.py", line 57, in acquire
super(TimeoutPIDLockFile, self).acquire(timeout, *args, **kwargs)
File "/home/airflow1/venv/airflow/lib/python3.8/site-packages/lockfile/pidlockfile.py", line 87, in acquire
raise AlreadyLocked("%s is already locked" %
lockfile.AlreadyLocked: /home/airflow1/airflow/airflow-webserver-monitor.pid is already locked
스케쥴러의 경우에는 airflow-scheduler.pid 파일이 문제가 되었다.
airflow-scheduler.pid, airflow-webserver-monitor.pid 파일은 각각 스케쥴러, 웹 서버의 프로세스 아이디를 저장한 파일이다. 각 프로세스가 종료되면서 파일을 정리해야 하는데, 정리하지 않고 종료된 것이 원인이다.
해결
문제가 되던 파일을 삭제하면 된다.
rm airflow-webserver-monitor.pid
rm airflow-scheduler.pid
파일을 삭제하고 다시 프로세스를 동작시키면 정상적으로 프로세스가 시작한 것을 확인할 수 있다.
참고 문서
https://stackoverflow.com/questions/51839397/airflow-scheduler-refuses-to-launch-on-demon-mode