私は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 Applications
( source )。
4。スクリプトの仕組みを以下に示します。