web-dev-qa-db-ja.com

再起動時にpythonスクリプトを実行するCronジョブが機能しない

私はLinuxを初めて使用し、再起動時にpythonスクリプトを実行するための多くの指示を読んで従いましたが、それらのいずれも機能しませんでした。

これは私が実行したいコマンドです:

/usr/bin/python3 /home/am/projects/AMAcc/map.py

crontab -eを使用して追加しました

@reboot /usr/bin/python3 /home/am/projects/AMAcc/map.py

Sudo crontab -eを試し、同じコマンドを追加しました

/etc/crontabファイルを編集し、上記のコマンドを追加しました。

pythonコードの先頭に#!/usr/bin/python3を追加し、その許可を次のように変更してみました:Sudo chmod a+x map.py

cron.denyファイルが存在するが空の場合、すべてのユーザーがcronジョブを実行できるとドキュメントが示唆しているので、cron.deny/etc/cron.denyの両方に空の/usr/lib/cron/cron.denyファイルを作成してみました。しかし、まだcronジョブを実行する運はありません。

私は何をしているのですか?

CronからGUIアプリケーションを実行するには、いくつかのデスクトップ環境変数をエクスポートする必要があります。ほとんどの場合、現在の$DISPLAY値をエクスポートするだけで十分です。アプリケーションを起動する追加のスタートアップ(bash)スクリプトを作成することをお勧めします。

この回答 では、現在のユーザーの$DISPLAY値を見つけてエクスポートするための堅牢なアプローチが提供されています。しかし問題がある。ユーザーがDEにログインしていない間、$DISPLAY値は設定されません。 S®では、 this answer で行われているように、追加の条件を追加できます。

# Get the value of the $DISPLAY variable for the current user. Unset it just in case this is a `ssh -X` connection
unset DISPLAY;
while [ "$DISPLAY" == "" ]; do
        export DISPLAY=$(w "$USER" | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}' 2>/dev/null) && sleep 3
done
  • この条件は他のすべての場合に機能しますが、@reboot Cronジョブ内で失敗し、理由がわかりません。そのため、以下のスクリプトでは、ユーザーがMateにログインしているかどうかを確認する別のアプローチが使用されています。

一部のアプリケーションでは、$DBUS_SESSION_BUS_ADDRESSおよび$DESKTOP_SESSIONとして、さらにいくつかの変数が必要です(たとえば、 this および this の回答を参照)。私の意見では、最良のアプローチは 現在のユーザーのデスクトップセッションプロセスを見つける ディレクトリ内で /proc (プロセス情報擬似ファイルシステム)であり、ファイルenvironそれは/proc/process-numberの中にあります。

cron-gui-launcher という専用の小さなプロジェクトを作成しました。 動作します しかし、すべてのユーザーのケース(現在のような)でテストされていません。ここで、Mate DEを参照する重要な部分を抽出し、上記の変更を加えました。

1。このコンテンツで実行可能ファイルを作成します。

#!/bin/bash -e

# Check whether the user is logged in Mate
while [ -z "$(pgrep mate-session -n -U $UID)" ]; do
        sleep 3 && count=$((count+1)) && echo "$count" > /tmp/mate-cron.log
done

# Get the content of the Current-Desktop-Session Environment File as an array:
EnvVarList=`cat -e "/proc/$(pgrep mate-session -n -U $UID)/environ" | sed 's/\^@/\n/g'`

# Export the Current-Desktop-Session Environment Variables:
for EnvVar in $EnvVarList; do
        echo "$EnvVar" >> /tmp/mate-cron.log
        export "$EnvVar"
done

# Execute the list of the input commands
Nohup "${1}" >/dev/null 2>&1 &

exit 0

2。次にcrontabで使用:

@reboot /path-to-the/script "your-application"

3。注:

  • このスクリプトは、ルートのcrontabでは機能しません。変数$UIDおよび$USERのため。特定のユーザーのUIDとNAMEでそれらを置き換えることができます。

  • 他のDEの場合、この部分のmate-session$(pgrep mate-session -n -U $UID)から他のDEのプロセスの名前に変更します(例:gnome-session)。

  • たぶんシステム起動時に実行されるGUIアプリケーションの場合、起動アプリケーション内にエントリを作成することをお勧めします。 Mate DEの場合:Control Centre > Personal > Startup Applicationssource )。

4。スクリプトの仕組みを以下に示します。

enter image description here

5
pa4080