web-dev-qa-db-ja.com

シャットダウン/リブートの前にコマンドを実行します

いくつかの迷惑なVMを実行しているマシンがあります。私が抱えている問題は、マシンをシャットダウンまたは再起動する前に、それらのVMをシャットダウンするのを忘れることがあることです。そのため、マシンはwaiting for vboxnet0 to become freeというメッセージで止まります。

私は解決策について検索し、このページを見つけました:

http://en.kioskea.net/faq/3348-ubuntu-executing-a-script-at-startup-and-shutdown

私は彼らがシャットダウンするものを試しましたが、うまくいきません。

そのコマンドのshファイルを書きました。

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

助言がありますか?

17
SERPRO

Vagrant VMがVirtualBoxを使用している場合、/ etc/default/virtualboxを変更して、次の行を変更できます。

SHUTDOWN_USERS=""

SHUTDOWN_USERS="all"

Ubuntu 14.04で修正された

11
GaryBishop

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

  1. スクリプトを/etc/rc6.dに保存します
  2. 実行可能にする:Sudo chmod +x K99_script

ノート:

  • Rc6.dのスクリプトには、.sh拡張子を付けないでください
  • 適切なタイミングで実行するには、スクリプトの名前がK99で始まる必要があります。
  • このディレクトリ内のスクリプトはアルファベット順に実行されます。

ソース

21
Maythux

Systemdでそれを行う方法(簡単です)

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

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


GUIバージョン

最初は、起動時および/またはシャットダウン時に実行するスクリプトを作成します。両方を必要としない場合は、どちらかを実行してください。 .scopening_atstartと.scfullcopy_atendを作成しました。

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

enter image description here

作成した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がマルチユーザーターゲットに入るたびに開始サービスが実行され、マルチユーザーターゲットを出るときに停止サービスが実行されます。アクティベーション条件が異なる代替サービスファイルについては、以下で説明します。

その他の便利なコマンドは次のとおりです。

systemctlが有効なスタートアップ
systemctl is-active startup
systemctl restart startup

詳細については、上記のリファレンスをご覧ください。



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

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

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

Create上記の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_stopおよびsystemctl 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
11
John 9631
  1. /etc/init.d/ディレクトリにスクリプトを使用してシェル実行可能ファイルを作成します。

  2. これはシャットダウンまたは再起動中に実行する必要があるため、/ etc/rc0.d /および/etc/rc6.dにソフトリンクを作成する必要があります

例:

Sudo ln -s /etc/init.d/<your_file> /etc/rc0.d/k99stop_vm
Sudo ln -s /etc/init.d/<your_file> /etc/rc6.d/k99stop_vm
Sudo chmod a+x /etc/init.d/<your_file>
11
Ravi

Ubuntu 14.10では、RC04ではなくRC99のようなものを使用します。

ゼロから何をすべきか

  1. /etc/init.d/scriptNameでスクリプトを作成します
  2. ln -s /etc/rc6.d/K04scriptName /etc/init.d/scriptName経由のリンク

私が行ったステップ

  1. buntu-起動時およびシャットダウン時にスクリプトを実行する の使用に失敗しました==
  2. 見つけました rc0.d(rc6.d、rc.d)を使用したUbuntu 14.10シャットダウンスクリプト
  3. /etc/rc6.d/RC99linkNameから/etc/rc6.d/RC04linkNameに変更しましたが、動作します
2
Anthony Astige

ここで解決策を見つけることができます: システムのシャットダウン/起動時にすべてのVagrantボックスを一時停止/再開します

シャットダウンする前に実行中のすべてのボックスを一時停止する単純なinitスクリプトがあります。

インストール

/etc/init.d/vagrant-boxesを編集し、上記の記事のスクリプトを貼り付けて保存します。または ここからダウンロード して/etc/init.d/vagrant-boxesに保存します。 debian/ubuntuなどで、実行します

# update-rc.d vagrant-boxes defaults 99 01

番号99はシーケンス番号であり、これよりも大きいはずです(私の場合は、Virtualbox番号20です。ちなみに、これはDebianディストリビューションのデフォルトです)。 2番目の数字は、コンピューターをシャットダウンするときのシーケンスです。だから、最初にやることは良いかもしれません。

2
milkovsky