ラップトップ(Ubuntu 14.04)をシャットダウンまたは再起動するたびに、最新のコードをリモートgitリポジトリにプッシュしたかどうかを確認するスクリプトを実行したいと思います。忘れた場合は、ターミナルを開き、ユーザーにコミットメッセージの入力を求め、変更をプッシュします。スクリプトは既に機能しています。
シャットダウンまたは再起動時に、GUIが終了する前にこのスクリプトを自動的に実行する方法を探しています。
これまでの私のアプローチは、System V Initを使用することです(はい、少し古いと思います)。
LSBヘッダーを含む私のinitスクリプトを/etc/init.dにコピーします。
Sudo cp ~/git_checker /etc/init.d/
、権限を変更:
Sudo chmod a+x /etc/init.d/git_checker
実行シナリオを構成します。
Sudo update-rc.d /etc/init.d/git_checker defaults
このスクリプトをSudo service git_checker start
でテストすると、「引数の解析に失敗しました:ディスプレイを開けません:」というエラーが表示されます。
Xサーバーがinitスクリプトが実行されるときに実行されることが保証されていないため、それを読んで、私はinitスクリプトがターミナルを開くために使用されるべきではないことを知りました(su user -c 'x-terminal-emulator -e /home/user/git_check.sh'
など)。
したがって、initスクリプトは間違った方法のようです。別の方法はありますか?多分upstartまたはsystemd?
システムの起動時にスクリプトを実行する場合は、起動アプリケーションに簡単に配置できます。シャットダウンアプリケーションなど、同様のものが存在しますか?
先ほど作成した 小さな監視スクリプト は、ユーザーがコンピューターのシャットダウンを試みたことをスクリプトが検出すると、割り込み関数を呼び出すようになります。特定の場合に必要な小さな変更は、シャットダウンアクションをキャンセルし、スクリプトを実行して、shutdownを呼び出すことです。
_#!/bin/bash
main()
{
dbus-monitor --profile "interface='com.canonical.Unity.Session',type=signal,member=RebootRequested" | \
while read -r line;
do
# echo $line
grep -q '.*NameAcquired.*' <<< "$line" && continue # Ignore that first line
if [ -n "$line" ];then
interrupt
fi
done
}
interrupt()
{
# The first command will close the shutdown dialog
qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.CancelAction
# place call to your script bellow this comment
zenity --info --text='Remember to Push changes to git repo'
# Uncomment line bellow for shutdown
# qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.Shutdown
}
main
_
もちろん、このスクリプトはスタートアップアプリケーションの一部として追加する必要があります。そうでない場合は、手動で.desktopファイルを作成できます。
[〜#〜]注[〜#〜]:このスクリプトはGUIでのみ機能するため、ユーザーがコマンド_Sudo shutdown -P now
_を発行すると、動作しません。また、_pgrep shutdown
_を使用して別のスクリプトでshutdown
コマンドを監視するか、別の関数をスクリプトに統合する必要があります。
たとえば、上記のスクリプトでは、この関数を追加する必要があります
_manual_shutdown_monitor()
{
while true
do
if pgrep shutdown > /dev/null
then
zenity --info --text="GOT MANUAL"
fi
sleep 0.25
done
}
_
そして、このようにmain()
でその関数を呼び出します
_manual_shutdown_monitor &
_