LoginSignup
3
4

More than 3 years have passed since last update.

Ubuntu18.04でログイン後自動でpythonスクリプト(GUI付き)とsudo権限のコマンドを実行する方法

Last updated at Posted at 2021-01-09

はじめに

Ubuntu18.04でGUIの出るpythonスクリプトをログイン後に自動実行する方法と、
sudo権限でいつも行っていたchmodコマンドを同様にログイン後に自動実行する方法を探していまして、
上手くいく方法が見つかったので備忘録がてら記事にしました。
GUIが出るというところが肝だったように思います。

この記事を読んでわかること

Ubuntu18.04
・GUIを生ずるpythonスクリプトをログイン後に自動実行する方法
・sudo権限のコマンドをログイン後に自動実行する方法

実行環境

Ubuntu18.04
python3.8
anaconda環境使用
起動後あるユーザーに自動ログインする設定済み

実施内容

Pythonスクリプトの自動実行方法について

sessionにpythonスクリプトを実行するシェルスクリプトを登録する

・アプリケーション一覧の検索窓で「session」と検索
・「アプリの自動実行」みたいな名前のアプリケーションを起動
・「追加」を押して、コマンド欄に実行したいシェルスクリプトを選択して設定

…以上

sessionはfirefoxなどGUIアプリケーションを自動起動させるときにも使います。
OS側でGUIを立ち上げる準備が出来てから実行されることが保証できるので、
GUIを生ずる今回のpythonスクリプトはここで実行することにしました。

crontabで実行することも試しましたが、GUIの立ち上がりでエラーしました。
 sessionに登録すると、実行するまでの時間がかかる印象ですが、
 それだけOS側では準備が必要なのでしょう。

ちなみに.shの内容

/hoge/hoge/foo.sh
cd /home/user名/hoge/hoge

/home/user名/anaconda3/bin/python /home/user名/hoge/hoge/foo.py

私は実行するpythonスクリプトの中に相対パスが含まれていたので、
foo.shも実行するスクリプトと同じ場所に作成しましたが、
なぜかpythonスクリプト内で相対パスで書いたファイルに対して
file not found errorになってしまったので、
シェルスクリプトの中でもcdして実行ファイルの場所まで移動することで解決しました。

pythonコマンドやスクリプトのパスは念のため絶対パスで書きました。

あとpythonはanaconda環境を使用しています。

sudo権限でコマンドを実行する方法について

rc.localにコマンドを記載

/etc/rc.local
#!/bin/sh
sudo chmod 666 /hoge/hoge

ポイント

rc.localがなければsudo権限で作成します
sudo vi /etc/rc.local

rc.localを実行可能ファイルにしておきます
sudo chmod u+x /etc/rc.local

説明

rc.localは今回の環境では/etc/rc.localでした。

18.04からは起動時の自動実行にsystemdが使われるようになりましたが、
互換性のためrc.localも使用可能です。

rc.localはroot権限で実行されるので記述が簡単です。
(試してないけど、sudoって記述要らない気がする)
crontabはroot権限ではないのでsudoコマンド書こうとすると少しめんどくさいです。

以前systemdを使おうとしてややこしい印象を持ったのと、
あまりうまくいかなかったので(笑)、今回はsystemdは使用しません。
ただ、18.04でrc.localを使うには結局systemdから動かしてもらうことになります。

参考

Ubuntu 18.04 rc.localsystemd設定

rc.localを動かすために必要な準備

rc-local.serviceというファイルに追記が必要です。

通常/bin/systemd/system下に存在しますが、
systemdに実行してもらうには/etc/systemd/system下にないといけませんので、
ポイントを見て方法を選んでください。

ポイント

rc-local.serviceが/etcに無ければ作成するか、
touch /etc/systemd/system/rc-local.service

もしくは本来/lib/systemd/system/rc-local.serviceなのでそこからリンクを貼ってください
ln -fs /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service

もし/etcに新規作成をした場合は、下記コマンドを実行して有効にしてください
systemctl enable rc-local.service

※systemdは/etc下を実行するようです。でもrc-local.serviceは/libにあります。
なのでリンクを貼るか、作成するかということになります。

rc-local.serviceへの追記内容

/bin/systemd/system/rc-local.service

#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.

[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

[Install]
WantedBy=multi-user.target
Alias=rc-local.service

参考

Documentation Ubuntu 18.04 rc.localsystemd設定
rc.localを使えない環境でマシン起動時にコマンドを実行する
ubuntu 18.04 で rc.local を使う

おわりに

GUIが出るときはsessionに登録することがポイントでした。
また、crontabとrc.localでは実行権限が異なることもポイントです。
rc.localで作ったファイルには鍵マークがつきます。
色々なやり方がありますが、似たような状況で困っている方の参考になれば幸いです。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4