web-dev-qa-db-ja.com

xserverがシャットダウンする前にインタラクティブスクリプトを実行する方法

ラップトップ(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?

システムの起動時にスクリプトを実行する場合は、起動アプリケーションに簡単に配置できます。シャットダウンアプリケーションなど、同様のものが存在しますか?

2
Oscillon

先ほど作成した 小さな監視スクリプト は、ユーザーがコンピューターのシャットダウンを試みたことをスクリプトが検出すると、割り込み関数を呼び出すようになります。特定の場合に必要な小さな変更は、シャットダウンアクションをキャンセルし、スクリプトを実行して、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 &
_
1