【自動化入門】Pythonでスクリプトを一定時間まで繰り返し実行&朝6時に自動停止させる方法【Windows/Linux対応】

「Pythonでスクリプトを一定時間まで繰り返し実行&朝6時に自動停止させる方法」のアイキャッチ
  • URLをコピーしました!

Pythonで自動スクリプトを定期的に実行させたいとき、
一定時間だけ動かして、朝になったら自動で止めたい」と思ったことはありませんか?

この記事では、次のようなニーズを叶えるテンプレートを紹介します。

  • 子スクリプトを何度もループ実行したい
  • 朝6時まで動かして自動で停止させたい
  • エラーで止まっても、確認後にEnterキーで再開したい
  • WindowsだけでなくLinuxやmacOSでも動かしたい

夜間バッチ、簡易監視、スクレイピングなどに役立つ自動実行テンプレートです。

\ 業務自動化の定番書。Excel・ファイル処理の実践例が豊富 /

目次

できることまとめ

  • 指定したPythonスクリプトをループ実行
  • 深夜〜朝6時など、STOP_HOURまで動かして自動停止
  • エラー時はブラウザなどを確認してからEnterで再開
  • 日付をまたいでも確実に朝6時に終了

使用ライブラリ

ライブラリ目的
subprocess子スクリプトの実行
datetime停止時刻の計算
timeスリープ処理
msvcrt(Windows)/ select(Linux)キー入力検知
pathlib / sysパス・Python環境の取得

【Windows版】Pythonでスクリプトを繰り返し実行し、朝6時に自動停止

Windows専用コード(msvcrtを使用)

\ ブラウザ操作を自在に自動化。記事内コードの理解が深まります /

# -*- coding: utf-8 -*-
"""
手動で起動 → 子スクリプトをループ実行 → 次の STOP_HOUR で自動停止
エラー終了ならブラウザを残して Enter 待機
"""
import subprocess, sys, time, datetime as dt, msvcrt
from pathlib import Path

# ========= ここだけ設定 =========
PYTHON_EXE  = sys.executable               # 使う Python
TARGET      = Path(r"C:\scripts\main.py")  # 子スクリプト
STOP_HOUR   = 6                            # 朝 06:00 で停止
PAUSE_ON_ERR = True                        # エラー時は Enter 待機
# =================================

def next_cutoff(now: dt.datetime) -> dt.datetime:
    cutoff = now.replace(hour=STOP_HOUR, minute=0, second=0, microsecond=0)
    if now >= cutoff:
        cutoff += dt.timedelta(days=1)
    return cutoff

def wait_enter_or_cutoff(cutoff: dt.datetime) -> bool:
    while True:
        if dt.datetime.now() >= cutoff:
            return False
        if msvcrt.kbhit() and msvcrt.getwch() == '\r':
            return True
        time.sleep(0.5)

def main():
    cutoff = next_cutoff(dt.datetime.now())
    print(f"★ 次の停止予定 : {cutoff:%Y-%m-%d %H:%M}")
    while True:
        print(f"[{dt.datetime.now():%H:%M}] {TARGET.name} を起動")
        ret = subprocess.call([PYTHON_EXE, str(TARGET)])
        if dt.datetime.now() >= cutoff:
            print(f"[{dt.datetime.now():%H:%M}] cutoff を過ぎたため終了します。")
            break
        if ret != 0:
            print(f"[ERR] 終了コード {ret}. ブラウザを確認後 Enter で続行。")
            if PAUSE_ON_ERR:
                if wait_enter_or_cutoff(cutoff):
                    continue
                else:
                    break
            else:
                break
        time.sleep(1)

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\nユーザー操作で終了しました。")

subprocess.call()で実行されるスクリプトの例(Seleniumの場合)

テンプレートでは、何度も実行されるスクリプトとして main.py を指定しています。
その中身は自由ですが、たとえば以下のようなSeleniumを使った自動操作スクリプトを設定できます。

# main.py の一例(ChromeでGoogle検索)
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.google.com")
search = driver.find_element(By.NAME, "q")
search.send_keys("Python 自動化")
search.submit()
driver.quit()

このようなmain.pyTARGET = Path(...) に設定しておけば、ブラウザ起動 → 検索 → 終了 を
繰り返し実行し、指定時刻に自動停止するようになります。

【Linux/macOS版】Pythonで同様の自動実行を行う方法

Linux/macOS対応コード(selectを使用)

# -*- coding: utf-8 -*-
"""
Linux/macOS 対応版。Enter待機に select を使う。
"""
import subprocess, sys, time, datetime as dt, select
from pathlib import Path

# ========= ここだけ設定 =========
PYTHON_EXE  = sys.executable
TARGET      = Path("/home/yourname/scripts/main.py")
STOP_HOUR   = 6
PAUSE_ON_ERR = True
# =================================

def next_cutoff(now: dt.datetime) -> dt.datetime:
    cutoff = now.replace(hour=STOP_HOUR, minute=0, second=0, microsecond=0)
    if now >= cutoff:
        cutoff += dt.timedelta(days=1)
    return cutoff

def wait_enter_or_cutoff(cutoff: dt.datetime) -> bool:
    print("Enterキーで再開(停止時刻を過ぎたら終了)…")
    sys.stdin.flush()
    while True:
        now = dt.datetime.now()
        timeout = (cutoff - now).total_seconds()
        if timeout <= 0:
            return False
        rlist, _, _ = select.select([sys.stdin], [], [], min(timeout, 0.5))
        if rlist:
            line = sys.stdin.readline()
            if line.strip() == "":
                return True
        time.sleep(0.1)

def main():
    cutoff = next_cutoff(dt.datetime.now())
    print(f"★ 次の停止予定 : {cutoff:%Y-%m-%d %H:%M}")
    while True:
        print(f"[{dt.datetime.now():%H:%M}] {TARGET.name} を起動")
        ret = subprocess.call([PYTHON_EXE, str(TARGET)])
        if dt.datetime.now() >= cutoff:
            print(f"[{dt.datetime.now():%H:%M}] cutoff を過ぎたため終了します。")
            break
        if ret != 0:
            print(f"[ERR] 終了コード {ret}. 確認後、Enter で続行。")
            if PAUSE_ON_ERR:
                if wait_enter_or_cutoff(cutoff):
                    continue
                else:
                    break
            else:
                break
        time.sleep(1)

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\nユーザー操作で終了しました。")

大量データを一括取得したい人の必携バイブル

解説:日付をまたいでも確実に停止する仕組み

if now >= cutoff:
    cutoff += dt.timedelta(days=1)

この部分によって、すでに6時を過ぎていたら翌日の6時まで待機
→ つまり、当日も翌日も適切に判断して停止時刻を決定します。

活用シーン

  • 夜間だけ動かしたい自動スクレイピング
  • 6時までで止めたいSNS自動投稿処理
  • 試験的にスクリプトを監視しながら連続実行

24 時間稼働の自動化サーバーを手軽に構築できます

カスタマイズ例

  • 停止時刻を「6時以外」にしたいときは STOP_HOUR を変更
  • ログファイル出力を追加すれば記録用にも使える
  • Linux対応のwait_enter_or_cutoffはターミナル専用の仕組み(GUIから実行する場合は注意)

まとめ

このテンプレートを使えば、次のような運用が簡単に実現できます。

  • Pythonで別スクリプトを繰り返し実行
  • 指定した時間(例:朝6時)で自動的に停止
  • エラー発生時はブラウザ確認後にEnterで再開可能
  • Windows・Linux/macOSの両方に対応!

ぜひ、自動化の第一歩としてこのコードを活用してみてください。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

当ブログの運営者であり全ての記事を書いた陰の者。
なんでも好きなものだけ書きます。
X(旧Twitter)でも更新情報とたまにくだらないことを発信中。
コメント解放しておりませんので、Xの方で感想いただけると嬉しくて更新が早くなる傾向にあります。調子乗りです。

目次