Tex, python, illusrator, VPSの学生ノート

latotex-blog

Python

目標や忘れたくない日のカウントダウンをLinuxログイン時に表示させる

投稿日:






ログイン直後に表示されるメッセージとして、/etc/motdに書き込むのは一つの方法ですが、カウントダウンのように日々数字が変わるようなメッセージは表示できません。

そこで、/etc/motdはいじらず、カウントダウンを表示するpythonファイルを起動時に実行するようにしました。できあがりはこんな感じです。173、2020、26が日ごとに更新されます。

$ ssh -x user@latoblog_vps -YC
Last login: Fri Apr 10 13:00:28 2020 from 123.456.789.10.jp
----------173 Sleeps To ThunderbirdsDay 2020!----------
----------26 Days Until Xday !----------

スポンサーリンク

pythonコード(login_countdown.pyとします)

pythonコードはどこにおいても構いません。後でまた使うので置いた場所はメモしておいてください。

ここでは作った.pyをlogin_countdown.pyとしますがファイル名はご自由に決めてください。

#!/usr/bin/env python
# coding: UTF-8


#必要なものを宣言
import datetime
from threading import Thread

#def thunderbird につかうもの
today = datetime.datetime.today()
set_year = today.year

#def xday につかうもの
n = 13
a = '%Y-%m-%d'


#サンダーバード記念日をカウントダウン
def thunderbird(today, set_year):

	#サンダーバード記念日
	target = datetime.datetime(set_year,9,30)

	#今日の日付から引いた値を表示
	showdate = target - today
	cdate =str(showdate.days +1)
	out = '----------' +cdate +' ' + 'Sleeps To ThunderbirdsDay' + ' ' + str(set_year) + '!' +'----------'

	#その年のサンダーバード記念日を超えてしまった場合365日を足すようにする
	if int(cdate) < 0:
		cdate = str(int(cdate) +365)
		out = '----------' + cdate +' ' + 'Sleeps To ThunderbirdsDay' + ' ' + str(set_year) + '!' + '----------'
		print(out)
	else:
		print(out)


#28日ごとにやってくるXdayへのカウントダウン
def xday(today, a):

	#28日の周期
	cycle = datetime.timedelta(days=28)
	#最近のXdayの日
	start_day = datetime.date(2020, 4, 8)

	#Nの数が多いと時間がかかるので、1年分(n=13)にした
	for i in range(n):

		#1年先まで、Xdayの日を表示
		target28_str = (start_day + i * cycle).strftime(a)

		#str型だと日付の差分を計算できないのでdatetimeにする
		target = datetime.datetime.strptime(target28_str, a)

		#日付の差分を計算
		showdate = target - today
		cdate =str(showdate.days +1)

		#このままだと、すべてのtargetについて差分を計算してしまうので、
		#直近のXdayとの差分のみ、表示する
		if 0 <= int(cdate) <= 28:
			out = '----------' + cdate + ' ' + 'Days Until Xday !' + '----------'
			print(out)

		#1年過ぎた場合に更新のお知らせをする
		elif i == n:
			out = '---------- TIME IS OVER ! check ~User/login_countdown/ ----------'
			print(out)
		else:
			pass


#今後、カウントダウンを増やす場合に備え、マルチスレッド処理
thread_1 = Thread(target=thunderbird,args=(today, set_year))
thread_2 = Thread(target=xday,args=(today, a))

thread_1.start()
thread_2.start()

pythonファイルを起動時に実行する方法

Linuxの場合、OSが立ち上がった時に最初に実行して欲しいファイルは /etc/profile.d/ にいれるとよさそうです。

まず、/etc/profile.d/に移動し、sudo権限でauto_start.shというファイルを作ります。「sudo vi auto_start.sh」の viはエディタのコマンドです。必要に応じて普段使っているエディタのコマンドに切り替えてください。

# cd   /etc/profile.d/
# vi auto_start.sh

開いたファイルに、以下の4行を追加します。作ったpythonファイル(login_countdown.py)の場所まで移動させて実行し、ログインしたユーザーのホームディレクトリにもどるという内容です。"pythonファイルまでのパスをいれる"の""はいりません。(例えば、作った.pyが/home/User/login_countdownにあるとき「cd /home/User/login_countdown」とかく)

#!/bin/sh
cd "pythonファイルまでのパスを入れる"
python login_countdown.py
cd

最後に、各ファイルに実行権限を与えてログアウトし、再びログインをすればメッセージが表示されます。後からカウントダウンしたいものを追加したり、表示する文章を変更したいときはlogin_countdown.pyを編集して再びログインすれば、変更が反映されます。

$ cd /etc/profile.d/
$ sudo chmod a+x auto_start.sh
$ cd "pythonファイルまでのパス"
$ sudo chmod a+x login_countdown.py

ちなみにlogin_countdown.pyにtime.sleep()を使っていないのでサーバーを停止してもカウントダウンに影響はありません。

何か問題があった際は追記してtwitter(@Lato901389571)でお知らせします。

スポンサーリンク

参考にしたサイト様

★pythonでカウントダウンをする方法(こちらのサイト様ではtime.sleep()を使っています)

https://www.sejuku.net/blog/73265

★login_countdown.pyの中で何度も使用しているdatetimeオブジェクトについて

https://note.nkmk.me/python-datetime-usage/

★pythonファイルを起動時に実行する方法について

(起動時の実行についてはほぼ、こちらのサイト様の内容を採用しています!リンクカード付でご紹介します。)


-Python

Copyright© latotex-blog , 2020 All Rights Reserved Powered by STINGER.