終了する前にコマンドを実行する

終了する前にコマンドを実行する

コンピュータがシャットダウンする前に簡単なコマンドを実行したい(時間は重要ではありません)。

起動には/etc/rc.localを使用できます。シャットダウンにも同様の機能はありますか?

メニューに統合された終了ボタンを使い続けたいです。つまり、端末を終了するたびにカスタムスクリプトを使用したくありません。自動的に実行する必要があります。

答え1

Linux MintはUbuntuに基づいているため、ランレベルのシステムもおそらく同じであると推測されます。 Ubuntuでは、さまざまな実行レベルのスクリプトがディレクトリにあるかどうかに基づいて実行されます/etc/rc[0-6].dランレベル0 は終了に対応し、6 は再起動に対応します。

通常、スクリプト自体は、/etc/init.d必要な実行レベルに対応するディレクトリに保存されている次のシンボリックリンクが配置されます。

したがって、あなたの場合は、スクリプトを作成して保存し、それぞれと/etc/init.d//etc/rc0.d両方が必要な場合)/etc/rc6.dスクリプトへのシンボリックリンクを作成します。

各ランレベルディレクトリのスクリプトは次の場所にあります。自然の秩序したがって、ランレベル内の順序が重要な場合は、それに応じてシンボリックリンクの名前を選択してください。

答え2

UbuntuバリアントとMintがsystemdに移動したので、上記の内容に基づいた以前の解決策は満足できません。私はsystemdを使ってこれを達成する方法をWebで検索し、最終的に他の人の知恵を組み合わせてブログ投稿として文書化しました。blogspot.com.au以下のチュートリアルが含まれています。

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


グラフィックバージョン

最初起動および/または終了時に実行するスクリプトを作成します。 .scopening_atstartと.scfullcopy_atendを作成しました。

それからファイルを右クリックして[プロパティ]を選択し、[権限]で[ファイルをプログラムとして実行できるようにする]が選択されていることを確認して、すべて実行可能であることを確認します。

私が作成した2つのファイルは、RAMディスクの内容を埋めて保存します。彼らはまた、サービスが実行されていることを証明するために私のホームディレクトリにファイルを作成しました。彼らの形態は次のとおりです。

#!/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

それからファイルマネージャをrootとして開き、/etc/systemd/systemstart.serviceファイルとsave-ramdisk.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を有効にするyour_files_nameコマンドを実行します(サフィックスサービスは除く)。だから私の最初はsystemctl enable startup

サービスを開始するには、コンピュータを一度再起動してください。 systemdがマルチユーザーターゲットに入るたびにスタートアップサービスを実行し、マルチユーザーターゲットから出るときにストップサービスを実行します。起動条件が異なる代替サービスファイルについては後述する。


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

この説明では、/home/johnではなくホームディレクトリで作業し、適切にsudoを使用し、vimまたはsvimを作成するエディタを選択したとします。

作る#!/bin/sh最初の行には、開始と終了のシェルスクリプトが含まれていますchmod +x my_new_filename

作る上記の2つのファイル(この例では1つのファイル)が開始操作と終了操作を処理します。私のホームディレクトリからスクリプトを実行しましたが、@don_crisstiがいくつかの選択肢を示しました。スタック交換

vim /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_stopこれらのコマンドをsystemctl is-active start_and_stop使用して新しいサービスを監視できます。


終了トリガ条件の変更

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

この文書は第2回答で提案されていますこの記事のただし、インストール部分を追加するまでは実行できません。

スクリプトを再編集し/etc/systemd/service/てを使用して有効にしますsystemctl enable your_file_namesystemctl 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

答え3

rc.shutdownLinuxカーネルの終了スクリプトを使用する必要があります。引用するOpenBSD のマニュアルページ:

Reboot(8) または Halt(8) コマンドを使用してシステムをシャットダウンするとき、init(8) がそうするように指示されたとき、またはキーボード要求の停止が実行されたとき (アーキテクチャがそれをサポートしている場合)、rc (8 ) "shutdown"パラメータを使用して呼び出されます。

したがって、rc.shutdownを開き、実行したいシェルコマンドを追加するだけです。

アップデート:Linux MintはUbuntuに基づいているため、起動/終了プロセスが異なるため、あなたに関連するプロセスは次のとおりです。

実行するシェルスクリプトを作成し、スクリプトが実行したい実行レベルに対応します/etc/rc*.d/。にコピーします。 Ubuntu は Debian ランレベルの番号付けに従い、ランレベル 0 は停止に使用され、ランレベル 6 は再起動に使用されます。*

答え4

rc.shutdownDebian Wheezy、Devuan、およびその派生などのバージョンで使用されているSysV依存初期化システムでは、rc.local次のような動作をエミュレートできます。

次のフレームにコマンドを追加します/etc/rc.shutdown

#!/bin/sh -e
#
# rc.shutdown
#

# <add your commands here, before exit 0>

exit 0

スクリプトを保存してファイルを実行可能にしますchmod a+x /etc/rc.shutdown

/etc/init.d/rc.shutdown次に、次のコンテンツを含む新しいスクリプトをシステムに追加します。

#! /bin/sh
### BEGIN INIT INFO
# Provides:          rc.shutdown
# Required-Start:
# Required-Stop:
# X-Stop-After:      umountroot
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Run /etc/rc.shutdown if it exist
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_stop() {
    if [ -x /etc/rc.shutdown ]; then
            [ "$VERBOSE" != no ] && log_begin_msg "Running local shutdown scripts (/etc/rc.shutdown)"
        /etc/rc.shutdown
        ES=$?
        [ "$VERBOSE" != no ] && log_end_msg $ES
        return $ES
    fi
}

case "$1" in
    start)
        # No-op
        ;;
    restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop|status)
    do_stop
        exit 0
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

また、スクリプトを実行可能にします。

/etc/rc[06].d にシンボリックリンクを作成します。

cd /etc/rc0.d ; ln -s ../init.d/rc.shutdown K01rc.shutdown

そして

cd /etc/rc6.d ; ln -s ../init.d/rc.shutdown K01rc.shutdown

insservシンボリックリンクを変更し、必要な.dependent.boot、.dependent.start、および.dependent.stopファイルを作成するために使用されます。

insserv -v

上記のすべてのコマンドを実行するには、rootまたはsudoを使用する必要があります。

関連情報