Ubuntuでログアウト/再起動/シャットダウン時にスクリプトを実行する


30

.shUbuntuのログアウトとシャットダウン時にbashを使用してファイルを実行したいと思います。私はウェブを上下に検索しましたが、KDEとGNOMEの修正のみを見つけました。スクリプトは単純です。「logoff / shutdown」ファイルにコード行を追加できるかどうか、または別のスクリプトで参照する必要があるかどうかを知る必要があります。


1
/etc/rc0.dおよび/etc/rc6.dの/etc/init.dおよび/etc/rc6.dの実行可能ファイルへのシンボリックリンクを配置する
さらに別のユーザー

2
更新された回答を(を使用してsystemd)受け入れることを検討してください。そうすれば、人々はそれを一番上に表示できます。
ジョナサンY.

回答:


18

ログアウト時にスクリプトを実行するには:

次の行を追加します。

session-cleanup-script=/path/to/script

/etc/lightdm/lightdm.confファイル。

この変更を有効にするには、lightdmを再起動する必要があります。これを行うには、Ctrl+ Alt+ を使用してtty1に移動F1し、ユーザー名とパスワードでログインして、次のコマンドを実行します。

sudo service lightdm restart

注:グラフィカルセッションに切り替えるには、Ctrl+ Alt+ F7を使用します

再起動時にスクリプトを実行するには:

  1. スクリプトを入れる /etc/rc0.d
  2. 実行可能にする: sudo chmod +x K99_script
  3. ノート:
    • このディレクトリ内のスクリプトはアルファベット順に実行されます。
    • K99適切なタイミングで実行するには、スクリプトの名前で始まる必要があります。

シャットダウン時にスクリプトを実行するには:

  1. スクリプトを入れる /etc/rc6.d
  2. 実行可能にする: sudo chmod +x K99_script
  3. ノート:
    • このディレクトリ内のスクリプトはアルファベット順に実行されます。
    • K99適切なタイミングで実行するには、スクリプトの名前で始まる必要があります。

ソース:


4
「Kill​​」および「Start」で始まるスクリプトに名前を付けることは一般的です。KS
キリ

スクリプトにsudo特権が必要な場合はどうなりますか?私が知る限り、/ etc / rc6.dスクリプトはユーザーとして実行され、gksudoを使用できません。
Urhixidur

1
14.04では機能しませんが、何か変更や重要でない事実はありますか?
トマス14年

2
K99のアドバイスは、アンマウント後に発生し、スクリプトを無効にするためにKが使用されるため(/etc/rcS.d/READMEを参照)、Sを使用してアンマウントする前にデータを保存する場合、シャットダウン/リブートには適していません。ブートアップの場所のためにあなたのスクリプトが後にマウントし、この誤報は、最初の文字としてSで解決するので、この上で捕まってしまった
tomasb

6
これは非常に間違っています。i)スクリプト名はK、ランレベル0、1、6、およびランレベル2、3、4、5で始まる必要がありSます。ii)スクリプトを呼び出す必要ありません。K99_foo番号はスクリプトの実行順序を決定するだけです。最後に実行する場合は、他のスクリプトよりも大きいものを選択する必要があります。iii)ランレベル0は再起動用ではありません!; シャットダウン用です。6は再起動用です。iv)スクリプトには、/etc/rcN.dディレクトリ内にビジネスがありません。それらは代わりににリンクされ/etc/init.dいる必要があり/etc/rcN.dます。
テルドン

14

systemdでそれを行う方法

2016年6月以降にこのスレッドを見つけた場合、UbuntuおよびMintを含むその派生製品はsystemdを使用してシステムの初期化とシャットダウンを制御します。私は古いアプローチに問題があったので、システム化された方法を研究しました。

systemdでは、1つまたは2つのファイルを作成して、以下のテンプレートを使用してスクリプトを呼び出し、コマンドを実行します。シンプル。


GUIバージョン

最初に、起動時またはシャットダウン時に実行するスクリプトを作成します。.scopening_atstartと.scfullcopy_atendを作成しました。

次に、ファイルを右クリックしてプロパティを選択し、アクセス許可の下で[ファイルをプログラムとして実行することを許可する]をオンにして、両方が実行可能であることを確認します。

作成した2つのファイルは、ramdiskの内容を生成して保存します。また、ホームディレクトリにファイルを作成して、サービスが機能していることを証明します。それらは次の形式でした:

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

次に、ファイルマネージャーをルートとして開き/etc/systemd/system、ファイルstartup.serviceとファイルsave-ramdisk.serviceを開いて作成しました。独自の名前を選択でき、一般的な名前にはjohns_start.serviceという名前のスタートアップファイルとjohns_shutdown.serviceという名前のシャットダウンファイルを含めることができます。既存のサービス名を選択しないでください。

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

そして

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

同じサービスファイルを使用して、実行可能スクリプトのフルパスを置き換えることができます。

最後に、それぞれに対してコマンドsystemctl enable your_files_nameを実行します(ただし、接尾辞サービスは使用しません)。だから私の最初のものはsystemctl enable startup

コンピューターを1回再起動して、サービスを開始します。systemdがマルチユーザーターゲットに入るたびに開始サービスが実行され、マルチユーザーターゲットを出るときに停止サービスが実行されます。アクティベーション条件が異なる代替サービスファイルについては、以下で説明します。


CLI(コマンドライン)バージョン

この説明は、/ home / johnではなくホームディレクトリから操作し、必要に応じてsudoを使用し、vimまたはsvimを作成するエディターを選択することを前提としています。

作成し、最初の行で起動およびシャットダウンシェルスクリプトを#!/bin/shして使用してそれらを実行しますchmod +x my_new_filename

上記の2つのファイル、またはこの例では起動タスクとシャットダウンタスクを処理する1つのファイルを作成します。ホームディレクトリでスクリプトを実行しますが、@ don_crisstiはStack Exchangeでいくつかの選択肢を示しました。

svim /etc/systemd/system/start_and_stop.service

ファイルの内容をコピーします:

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

次に、コマンドを使用してサービス有効にします

systemctl enable start_and_stop

システムを再起動すると、サービスがアクティブになります。コマンドsystemctl is-enabled start_and_stopsystemctl is-active start_and_stopは、新しいサービスの監視に使用できます。


シャットダウンのトリガー条件の変更

上記のファイルはすべて、マルチユーザー環境のオープンまたはクローズを使用して、スクリプトの実行を開始します。以下のファイルは、4つの潜在的なシャットダウンプロセスの開始を使用して、スクリプトを開始します。Before行+ WantedBy行でターゲットを追加または削除すると、さらに細かく区別できます。

このファイルは、@ MatthiasによるUnix&Linuxでの回答で提案されましたが、インストールセクションを追加するまで実行できませんでした。

再度、でスクリプトを編集し、/etc/systemd/service/を使用して有効にしsystemctl enable your_file_nameます。ターゲットを変更したとき、systemclt disable file_nameコマンドを使用し、それを再度有効にしてターゲットディレクトリにシンボリックリンクしました。再起動すると、サービスが動作します。

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target

1
あなたの投稿は正しいものですが、そのような手順をシステムでどのように実行できるかの例を追加することで、改善することをお勧めします。投稿を編集したらお知らせください。ありがとう、AskUbuntuへようこそ
Sergiy Kolodyazhnyy

こんにちはセルグ、リンクされた投稿などの例を意味しますか、または何か他のことを考えていましたか?第二に、他のSOユーザーに連絡するためのメカニズムが見つからないため、「知らせる」方法がわかりません。
ジョン9631 16

はい、他の投稿と同じ例を提供できます。「他のリンクに移動する」と言うだけではあまりよくないので、答えが怠lookに見えます。また、別のSOユーザーに連絡するには、ユーザー名の前に@を使用します。たとえば、@ Serg
Sergiy Kolodyazhnyy

大幅に改善されました。非常によく、良い仕事を続けてください!
セルギーKolodyazhnyy 16

1
応じてman systemd.unit、ユーザーが作成したファイルに配置することができます$XDG_CONFIG_HOME/systemd/userし、他のローカルユーザーの場所
アントニオHadjigeorgalis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.