シャットダウン/リブートの前にコマンドを実行[複製]


18

いくつかの迷惑な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

助言がありますか?


4
リンク内のメソッドは有効であり、すべてのlinuxバージョンで機能するため、スクリプトは間違っています;)ユーザーはrootによって実行されるため、シャットダウン時にユーザーは不明です。そのため、「〜」をドロップして完全なパスにします。
リンツウィンド14

動作しますか?私はgist.github.com/ymc-geha/8416723のような同様のマニュエルに従いましたが、ubuntu 14.04
user2135804

@ user2135804私はそれが…と思ったが、実際にはVagrantではうまくいかなかった。.他のもので試したところ、うまくいった。
SERPRO 14年

1
ところで、説明しているバグはこちらです。
ギャレット

1
バグレポートに見られるように、これは修正されており、VirtualBox 4.3.29に含まれます。
ギャレット

回答:


11

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

SHUTDOWN_USERS=""

SHUTDOWN_USERS="all"

Ubuntu 14.04で修正された


1
実際には、これに関連する仮想ボックスにオープンチケットがあります。virtualbox.org/ticket/12264。私はsuggesは使用してしまうSHUTDOWN_USERS=`cut -d: -f1 /etc/passwd`代わりにSHUTDOWN_USERS="all"
running.t

VirtualBoxを使用してVagrantでUbuntu 14.04を使用していますが、/etc/default/virtualboxファイルがありません
Garrett

21

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

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

ノート:

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

ソース


1
確かに。適切な名前を付けて、適切なタイミングで実行されるようにすることが非常に重要です。
シヴァム

1
/etc/rc6.dにスクリプトを配置しましたが、シャットダウン時に実行されませんでした。/etc/rc0.dに配置し、シャットダウン時に実行しました。おそらく、rc.6は再起動専用です。
エレルシーガルハレビ

2
@Erel Segal-Halevi / 99 / K6スクリプトを/etc/rc6.dに追加しようとしましたが、実行されませんでした。他のスクリプトを見ると、**太字のK10reboot-> ../init.d/reboot ** codeという行があるので、K99スクリプトは実行されないように見えます!!
デビッドウォーカー

以下のRaviからの回答は、シンボリックリンクを使用して、シャットダウンと再起動の両方でスクリプトが実行されるようにするため、より良い選択です。また、ほとんどのシステムファイルはこのアプローチを取る傾向があると思います。
エディ

12

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

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

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

systemctl is-enabled startup
systemctl is-active startup
systemctl restart startup

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



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行でターゲットを追加または削除すると、さらに細かく区別できます。

このファイルは、この投稿の 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
より簡単に?何より簡単?エベレストに登るよりも簡単ですか?他のすべてのソリューションは...これよりも簡単ですここに掲載
フランMarzoa

うわー、それは完全できちんと書かれた答えであり、誰もがすべきことです-/etc/rc6.dのネーミングの問題と混乱は、それらが良い答えではないことを示しています。手順が単純な場合、その目的を安全に達成する力は必ずしもありません。[インストール]セクションを参照してください-スクリプトが正しい時間に実行されることを確認できます。さらに、答えが長いので、それはその複雑さを意味しません!おかげで、John9631、この答えは完璧であり、ミッションクリティカルな時点で安全で効率的なスクリプトを作成するのに非常に貴重です...
ミラーゴリラ

11
  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>

chmodリンクターゲットの許可フラグを変更します。これは両方の引数で同じです。両方を指定することは冗長です。
デビッドフォースター14年

2

ここで解決策を見つけることができます:システムのシャットダウン/起動時にすべての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

Ubuntu 14.10の場合はRC04そうではありませんRC99

最初から行うこと

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

行った手順

  1. Ubuntuの使用に失敗しました -起動時とシャットダウン時にスクリプトを実行します
  2. rc0.d(rc6.d、rc.d)でUbuntu 14.10シャットダウンスクリプトを見つけました
  3. /etc/rc6.d/RC99linkNameから/etc/rc6.d/RC04linkNameに変更しましたが、動作します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.