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

# はじめに
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設定](https://sourceexample.com/article/jp/1f2116cf8350c16df7cb34f970ebb76b/)

##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設定](https://sourceexample.com/article/jp/1f2116cf8350c16df7cb34f970ebb76b/)
[rc.localを使えない環境でマシン起動時にコマンドを実行する](http://atomiyama.com/linux/page/rc-local-systemd/)
[ubuntu 18.04 で rc.local を使う](https://qiita.com/tanyorg/items/401cbadd88fa3fe0b9d3)

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