systemd を使用して Selenium を Linux デーモンとして設定する方法

Mary-Kate Olsen
リリース: 2024-10-18 18:17:29
オリジナル
426 人が閲覧しました

How to Set Up Selenium as a Linux Daemon with systemd

ubuntu または debian 上で Chrome と Selenium をセットアップして実行します。このガイドは ubuntu 22.04

に基づいています

Selenium は Web タスクの自動化に最適ですが、サーバー上でボットを 24 時間 365 日実行し続けるのは難しい場合があります。 systemd を使用すると、Selenium ボットをバックグラウンド サービス (デーモン) として実行でき、確実に実行され、障害時に再起動されます。このガイドでは、Linux VPS 用の構成を中心に、セットアップ手順を説明します。

目次

  1. Google Chrome のインストール

  2. 仮想環境のセットアップ

  3. 必要なパッケージのインストール

  4. Python スクリプトの作成

  5. systemd サービスのセットアップ

    • ENV 変数の追加 (オプション)
    • サービスファイル
    • サービスの実行
  6. ブロックバッファリングの問題を修正

    • -u フラグの使用
    • 印刷フラッシュ引数の使用
  7. journalctl を使用したログへのアクセス

  8. 参考資料


Google Chromeのインストール

まず、すべてのパッケージを更新します。

sudo apt update
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

安定した Google Chrome パッケージをダウンロードします。

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

Google Chrome をインストールします。

sudo apt install -y ./google-chrome-stable_current_amd64.deb
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

インストールされている Google Chrome のバージョンを確認します。

google-chrome --version
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

仮想環境のセットアップ

マシン上で Selenium ボットのみを実行している場合、これらの手順は必須ではありません。ただし、他のプロジェクトに取り組んでいる場合や、隔離された環境が必要な場合には、これをお勧めします。

仮想環境を作成しましょう。

python3 -m venv venv
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

仮想環境をアクティブ化します。

source venv/bin/activate
ログイン後にコピー
ログイン後にコピー

必要なパッケージのインストール

次に、Selenium と webdriver-manager をインストールします。

pip install selenium
pip install webdriver-manager
ログイン後にコピー

webdriver-manger の目的は、さまざまなブラウザーのバイナリ ドライバーの管理を簡素化することです。詳細については、ドキュメントを参照してください。


Python スクリプトの作成

## main.py

from selenium import webdriver
## ---- Use for type hint ---- ##
from selenium.webdriver.chrome.webdriver import WebDriver
## --------------------------- ##
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager


def create_chrome_web_driver_connection(headless: bool,
                                       detach:bool,
                                       use_sandbox: bool,
                                       use_dev_shm: bool,
                                       window_width: int = 1052,
                                       window_height: int = 825
                                       ) -> WebDriver:

    service = Service(ChromeDriverManager().install())
    options = Options()
    options.add_experimental_option("detach", detach)
    options.add_argument(f"--window-size={window_width},{window_height}")
    options.add_argument("--disable-extensions")
    options.add_argument("--disable-renderer-backgrounding")
    options.page_load_strategy = 'normal'

    if not use_sandbox:
        options.add_argument('--no-sandbox')
    if not use_dev_shm:
        options.add_argument('--disable-dev-shm-usage')
    if headless:
        options.add_argument("--headless=new")

    driver = webdriver.Chrome(service= service, options=options)

    return driver



if "__main__" == __name__:
    driver =  create_chrome_web_driver_connection(headless= True,
                                                 detach= False,
                                                 use_sandbox= False,
                                                 use_dev_shm= False)

    driver.get('https://python.org')
    print(driver.title)

    driver.close()

ログイン後にコピー

options.add_experimental_option("detach", detach) :

  • これにより、スクリプトの実行が終了した後も Chrome ブラウザを開いたままにするかどうかを構成できます。
  • detach が True の場合、WebDriver セッションが終了した後もブラウザ ウィンドウは開いたままになります。

options.add_argument(f"--window-size={window_width},{window_height}") :

  • これにより、ブラウザのウィンドウ サイズが幅と高さで設定されます。

必要に応じて、この行を削除できます。
Selenium をヘッドレス モードで実行する予定がある場合は、必ずこの方法でウィンドウ サイズを設定してください。そうしないと、私の経験では、デフォルトのウィンドウ サイズが小さすぎる可能性があります。

このコマンド driver.get_window_size() でウィンドウ サイズを確認できます

options.add_argument("--disable-extensions") :

  • 拡張機能はブラウザの自動操作を妨げる可能性があるため、拡張機能を無効にすると安定性が向上します。

options.add_argument("--disable-renderer-backgrounding") :

  • これにより、Chrome がバックグラウンド タブの優先順位を下げたり、一時停止したりすることがなくなります。
  • これは、複数のタブにまたがってアクションを実行する場合に便利です。

options.page_load_strategy = '通常' :

  • これにより、ページの読み込み戦略が通常に設定されます。つまり、Selenium はページが完全に読み込まれるまで待機してから、以降のコマンドを続行します。
  • その他のオプションには、eager (DOMContentLoaded イベントまで待機する) や none (ページのロードを待機しない) などがあります。詳細については、こちらをご覧ください。

options.add_argument('--no-sandbox') :

  • サンドボックスは、ブラウザのプロセスを分離する Chrome のセキュリティ機能です。
  • サンドボックスが権限の問題やクラッシュを引き起こす一部のテスト環境 (Docker コンテナ内や root ユーザーとしてスクリプトを実行する場合など) では、これを無効にする (--no-sandbox) と便利です。

options.add_argument('--disable-dev-shm-usage') :

  • /dev/shm は、Linux 環境でよく使用される共有メモリ空間です。デフォルトでは、Chrome はパフォーマンスを向上させるためにこれを使用しようとします。
  • これを無効にする (--disable-dev-shm-usage) と、共有メモリが制限されている環境でのクラッシュを防ぐことができます。

options.add_argument("--headless=new") :

  • これにより、GUI なしで Chrome を実行するヘッドレス モードが有効になります。
  • ヘッドレス モードは、CI/CD パイプラインやリモート サーバーなど、ディスプレイのない環境で実行する場合に便利です。

systemd サービスのセットアップ

ENV 変数の追加 (オプション)

Selenium プログラムで環境変数を使用する必要がある場合、これを実現するには 2 つの方法があります。

  1. python-dotenv などのライブラリで .env ファイルを使用する (より一般的で人気のある方法)。

  2. systemd の組み込みオプションを使用して環境ファイルをセットアップします。

この例では、2 番目のオプションを使用します。

まず、/etc ディレクトリ内に conf.d ディレクトリを作成しましょう。

sudo apt update
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次に、プレーンテキストファイルを作成します(これが環境ファイルになります)。

sudo apt update
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これで、作成したファイルに環境変数を追加できます。

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

環境変数を使用するように Python スクリプトを変更します。

sudo apt install -y ./google-chrome-stable_current_amd64.deb
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

サービスファイル

この /etc/systemd/system/ ディレクトリ内にサービス ファイルを作成する必要があります。ここは、システム管理者によってインストールされた systemd ユニットが配置される場所です。

google-chrome --version
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

この例では、あなたが VPS にいて、root ユーザーとしてサービスを実行すると仮定します。

[!警告]
サービスは root (管理者) 権限で実行されます。これにより、システムへの完全なアクセスが許可されますが、通常、セキュリティ上の理由で必要な場合を除き、root として実行することは避けられます。

これをサービス ファイルに追加します。

python3 -m venv venv
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

[単位]セクション

このセクションでは、サービスのメタデータと依存関係を定義します。

Description=Selenium Bot Service : サービスの機能の簡単な説明を提供します。この場合、「Selenium Bot Service」として説明されています。この説明は、サービスを識別するためにシステム ログと systemctl によって使用されます。

After=network.target: これにより、ネットワークが利用可能になった後にのみサービスが開始されます。 network.target は、基本的なネットワーク機能が稼働していることを示す systemd ターゲットです。

[サービス]セクション

このセクションでは、サービスの実行方法、どのユーザーが実行するか、失敗した場合の対処方法など、サービス自体の構成を指定します。

User : サービスを実行するユーザーを指定します。ここではrootに設定しています。

EnvironmentFile : サービスで使用される環境変数を含むファイルを指定します。

WorkingDirectory: サービスを実行するディレクトリを指定します。これはサービス プロセスの作業ディレクトリです。ここでは、ボット ファイルは /root/selenium_bot/

に保存されています

ExecStart : サービスを開始するコマンドを定義します。ここでは、/root/selenium_bot/

にある main.py ファイルを実行します。

Restart=on-failure : サービスが失敗して終了した場合 (つまり、ゼロ以外の終了ステータス)、自動的に再起動するようにサービスを構成します。これは、時折障害が発生する場合でも、ボット サービスが確実に実行され続けるようにするのに役立ちます。

RestartSec=5s : 失敗した場合の再起動間の遅延を指定します。この場合、サービスは失敗後に再起動を試みるまで 5 秒待機します。

StandardOutput=journal : サービスの標準出力 (stdout) を systemd ジャーナルにリダイレクトします。これは、journalctl を使用して表示できます。これは、ログ記録とデバッグの目的に役立ちます。

StandardError=journal : 標準エラー (stderr) 出力を systemd ジャーナルにリダイレクトします。サービスで発生したエラーはすべてログに記録され、journalctl

を使用して表示することもできます。

[インストール]セクション

このセクションでは、サービスをいつどのように有効化または開始するかを定義します。

WantedBy=multi-user.target : サービスを有効にするターゲットを指定します。この場合、multi-user.target は、システムが非グラフィカル マルチユーザー モード (サーバーで一般的) のときに到達する systemd ターゲットです。これは、システムがこのターゲットに到達したとき、通常はシステムがマルチユーザー環境で起動したとき、サービスが開始されることを意味します。

systemd サービスで可能なすべての設定の詳細については、リファレンスを確認してください

サービスの実行

サービス ファイルが有効であることを確認してみましょう。すべてが正常であれば、何も表示されないはずです。

sudo apt update
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

systemd 構成をリロードして、新しいユニットまたは変更されたユニット (サービス) を探します。

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

サービスを開始/再起動します。

sudo apt install -y ./google-chrome-stable_current_amd64.deb
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

サービスを停止してください。

google-chrome --version
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

サービスのステータスを確認してください。

python3 -m venv venv
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

起動時にサービスを自動的に開始する場合は、これを実行します。

source venv/bin/activate
ログイン後にコピー
ログイン後にコピー

ブロックバッファリングの問題の修正

Python では、対話型環境でスクリプトを実行するとき (たとえば、ターミナルで python3 filename.py を手動で実行するとき)、Python は行バッファリングを使用します。これは、print() ステートメントからの出力と同様に、出力がすぐに表示されることを意味します。

ただし、Python プログラムが非対話型環境で実行される場合 (これは今回のケースです)、出力ではブロック バッファリングが使用されます。これは、バッファがいっぱいになるかプログラムが終了するまで、プログラムは出力をバッファに保持し、ログや出力が表示されるまで遅れることを意味します。

Python の出力バッファリングの仕組みについて詳しくは、こちらをご覧ください。

ログと出力をリアルタイムで表示したいため、この問題には 2 つの方法で対処できます。

-u フラグの使用

Python3 ドキュメントにはこれが記載されています。

-u stdout ストリームと stderr ストリームのバッファリングを強制的に解除します。 このオプションは標準入力ストリームには影響しません

-u フラグを使用すると、Python は stdout と stderr の両方に対して完全なバッファなしモードで動作します。これは、各バイトが生成されるとすぐに端末 (またはログ ファイルなどの出力ストリーム) に直接送信されることを意味します。バッファリングはまったく行われません。

通常 stdout に出力されるすべての文字 (print() ステートメントやエラーなど) は、行全体やバッファーが蓄積されるのを待たずに、バイト単位で即座に書き込まれます。

このオプションを使用するには、次のようにスクリプトを実行します:

sudo apt update
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このオプションを使用する場合は、サービス ファイル内の ExecStart を必ず変更してください。

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

印刷フラッシュ引数の使用

Python では、print() 関数はデフォルトで出力をバッファリングします。つまり、出力はメモリに保存され、バッファがいっぱいになるかプログラムが終了した場合にのみ出力されます。 flash=True を使用すると、print() 呼び出しの直後に Python に出力を強制的にフラッシュさせ、出力がすぐに表示されるようにすることができます。

sudo apt install -y ./google-chrome-stable_current_amd64.deb
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

Journalctl を使用したログへのアクセス

systemd ユニット (サービス) の完全なログ履歴を表示するには、次のコマンドを使用します。

google-chrome --version
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

リアルタイムでログを監視するには、-f フラグを使用します。これにより、最新の日記エントリのみが表示され、日記に追加される新しいエントリが継続的に出力されます。

python3 -m venv venv
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

参考文献

  • https://github.com/password123456/setup-selenium-with-chrome-driver-on-ubuntu_debian
  • https://www.selenium.dev/documentation/webdriver/drivers/options/
  • https://www.lambdatest.com/blog/selenium-page-load-strategy/
  • https://pypi.org/project/webdriver-manager/
  • https://pypi.org/project/python-dotenv/
  • https://wiki.archlinux.org/title/Systemd
  • https://man.archlinux.org/man/systemctl.1
  • https://man.archlinux.org/man/systemd.service.5.en#EXAMPLES
  • https://man.archlinux.org/man/systemd-analyze.1
  • https://docs.python.org/3/using/cmdline.html#cmdoption-u
  • https://realpython.com/python-flush-print-output/
  • https://man.archlinux.org/man/journalctl.1

以上がsystemd を使用して Selenium を Linux デーモンとして設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!