ubuntuアップデートからの悪夢
時々来る、アップデートのお知らせ
criticalの脆弱性だったはずだから、chromeアップデートしておかないと・・・と
127.0.6533.89へバージョンアップをした。
そのほかにも、ubuntuのパッチなども
※ubuntuは24.04を使用
そう、それは悪夢の始まり
cronが動かなくなったが、単体では普通に動く
ログを出してみた。
(The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
色々調べると下記が必要だというが入っている。
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
別で調べて下記のように追加したが、このエラーかchromedriverからのタイムアウトエラーが出ていて、堂々巡りになってドはまり・・・
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
+ chrome_options.add_argument("--disable-dev-shm-usage")
+ service = Service("/path/to/chromedriver")
(結局これは元のコードで問題なかった)
cronと普通のシェルの違い
envの環境設定がほぼない。PATHの設定などないといっていい。
おそらく、ここに問題があるが・・・何がどう絡んでいるのかは分からない。
cronの代替えはないものか!!!
cron代替え atコマンド!!
cronと違って、使い捨てのスケジュールコマンド。少々使い勝手が悪いが!
atコマンドをインストールしいざ実行
at -f /path/to/shell.sh 00:00
これで次の0時に処理開始となる。
動いた!!!
これで安心だー!
って思ってcronで毎日1回動かしてスケジュールを入れさせてこれでオッケーだ!
ようやく解放された!!と安堵。
次の日、動いてなかった
動いてない!?どうしてなのか!
普通にシェルからatを起動して、動く・・・?
どうして?
と、少しばかりshellの内容を変更してみる。python→python3、ログ出力など(リンクしてるのでptyhon3でも変わらない)
と、at コマンドの使い方でみた -c コマンドを思い出す。
これは、コマンドの詳細を出すというもの。現在登録されているジョブを表示(cronで登録)
at -c 10 (ジョブ番号)
#!/bin/sh
# atrun uid=1000 gid=1000
# mail XX 0
umask 2
HOME=/home/XX; export HOME
LOGNAME=XX; export LOGNAME
PATH=/home/XX/python_v/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin; export PATH
LANG=ja_JP.UTF-8; export LANG
PWD=/home/XX; export PWD
cd /home/XX || {
echo 'Execution directory inaccessible' >&2
exit 1
}
#/bin/sh
export DISPLAY=:0
export PATH="/home/XX/python_v/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin"
. /home/XX/python_v/bin/activate
python /home/XX/storage/selenium/exec.py
あ、これ環境変数まで入れて実行されてるんだ。
pathも入ってるし特段問題なし
あれ、さっき変更したptyhonコマンドが変更されてない?
その時スケジュールされた時の状態が保存されているのか
まてよ、cronで登録したものとシェルから登録したもので差があるのでは・・・?
と再度動かしてみました。ジョブ番号をメモ。
at -f /path/to/shell.sh 00:00
コマンド内容を表示!
at -c 11 (ジョブ番号)
#!/bin/sh
# atrun uid=1000 gid=1000
# mail XX 0
umask 2
SESSION_MANAGER=local/....; export SESSION_MANAGER
QT_ACCESSIBILITY=1; export QT_ACCESSIBILITY
COLORTERM=truecolor; export COLORTERM
XDG_CONFIG_DIRS=...; export XDG_MENU_PREFIX
:
:
cd /home/XX || {
echo 'Execution directory inaccessible' >&2
exit 1
}
#/bin/sh
export DISPLAY=:0
export PATH="/home/XX/python_v/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin"
. /home/XX/python_v/bin/activate
python /home/XX/storage/selenium/exec.py > /home/XX/at.log 2>&1
違う!!
その環境変数が全登録されていることに気が付きました。
(ということは、cronでの環境変数が見られたということになりますね。)
おそらく、cronも同じ方法で登録しているのかと思われます!
一番上のSESSION_MANAGER
が怪しいと思いましたが、とりあえず環境変数部分を全部シェルに入れてスケジューラー登録!
動いた!!!
スケジュール一旦全削除してcronから登録!
動いた!!
結論 一旦全環境変数を設定してみましょう!
少々荒業ですが、これで解決しました。
すこしづつ環境変数を削れば見えてくるのではないかと!
(環境によって変わると思われるので、これさえあれば大丈夫ですとはいいません)
気力がなくて試してないですが、cronでも同じであると思われます。
シェルで動いてるのに、cronでは動かない。動かなくなった!という人は一度お試しください。