シャットダウンする前にコマンドを実行する


52

コンピューターがシャットダウンする直前に単純なコマンドを実行したい(タイミングは必須ではない)。

起動には、/ etc / rc.localを使用できます。シャットダウンに似たようなものはありますか?

メニューから統合シャットダウンボタンを引き続き使用したいことに注意してください。つまり、端末からシャットダウンするたびにカスタムスクリプトを使用したくありません-自動である必要があります。

回答:


42

Linux MintはUbuntuに基づいているため、ランレベルシステムはおそらく同じだと思います。Ubuntuでは、さまざまなランレベルのスクリプトが/etc/rc[0-6].dディレクトリ内の存在に応じて実行されます。ランレベル 0はシャットダウンに対応し、6は再起動に対応します。

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

だからあなたの場合には、それを保存し、スクリプトを記述し/etc/init.d/、その後のそれぞれにシンボリックリンクを作成/etc/rc0.dし、/etc/rc6.d(あなたが両方必要な場合)スクリプトを指します。

各ランレベルディレクトリ内のスクリプトはasciibetical順序で実行されるため、ランレベル内の順序が重要な場合は、それに応じてシンボリックリンクの名前を選択します。


init.d(正確なKubuntu)のスケルトンファイルを見てみると、少し怖がっていました。シャットダウンの日付をエコーするいくつかのコマンドを/ var / logの下のファイルに追加したいだけです。それだけでいいのですか、それともスケルトンファイルの他のいくつかを処理する必要がありますか?
ジョー

2
@Joe-スクリプトを標準サービスとして制御できるようにしたい場合を除いて、ほとんどのものは必要ありません。あなた自身のログファイルへの単純なエコーで何も壊さないので、試してみてください。
-ire_and_curses

1
以下に init.dスクリプトの簡単なサンプルを示します。また、使用してシンボリックリンクを作るために簡単に、より堅牢だsudo update-rc.d /etc/init.d/myservice defaults
RolfBly

/etc/init.d/spark_shutdown.shを作成し、/ etc / rc0.dと/etc/rc6.dにリンクを作成しました。このスクリプトがubuntu aws ec2インスタンスで実行されたことを確認するにはどうすればいいですか
Ashish Karpe

10

Ubuntuの亜種とMintがsystemdに移行した今、上記に基づいた古いソリューションでは満足度が低いことがわかりました。私はsystemdでそれを行う方法を見つけるためにウェブを検索し、他の人の知恵を組み合わせて、次のチュートリアルを含むblogspot.com.auのブログ投稿として文書化しました。

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でいくつかの選択肢を示しています。

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_stopsystemctl is-active start_and_stopは、新しいサービスの監視に使用できます。


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

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

このファイルは、この投稿の 2番目の回答提案されましたが、インストールセクションを追加するまで実行できませんでした。

再度、でスクリプトを編集し、/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

7

rc.shutdownLinuxカーネルのシャットダウンスクリプトを使用する必要があります。OpenBSDのmanページを引用:

システムがreboot(8)またはhalt(8)コマンドを使用してシャットダウンされたとき、またはinit(8)がそのように通知されたとき、またはキーボードで要求された停止が発行されたとき(アーキテクチャがサポートしている場合)、rc( 8)引数 `` shutdown ''で呼び出されます。

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

更新:Linux MintはUbuntuをベースにしており、Ubuntuは異なる起動/シャットダウン手順を持っているため、ここに関連する手順を示します。

実行したいシェルスクリプトを記述し、それをの関連ディレクトリにコピーします/etc/rc*.d/*スクリプトを実行したい時にランレベルに対応しています。
UbuntuはDebianのランレベル番号に従っているため、停止にはランレベル0、再起動にはランレベル6があります。


1

SysVの依存ベースのinitのDebian Wheezyに、Devuanに使用されるシステム及びその誘導体と、おそらく他の人のために、あなたはの行動を模倣することができますrc.shutdownにアナログを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して、シンボリックリンクを修正し、必要な.depend.boot、.depend.start、および.depend.stopファイルを作成します。

insserv -v

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


今日は少し時間を無駄にしましたが、Ubuntu 16で動作させることができませんでした。
マイクQ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.