回答:
Linux MintはUbuntuに基づいているため、ランレベルシステムはおそらく同じだと思います。Ubuntuでは、さまざまなランレベルのスクリプトが/etc/rc[0-6].d
ディレクトリ内の存在に応じて実行されます。ランレベル 0はシャットダウンに対応し、6は再起動に対応します。
通常、スクリプト自体はに保存され/etc/init.d
、その後、必要なランレベルに対応するディレクトリにシンボリックリンクが配置されます。
だからあなたの場合には、それを保存し、スクリプトを記述し/etc/init.d/
、その後のそれぞれにシンボリックリンクを作成/etc/rc0.d
し、/etc/rc6.d
(あなたが両方必要な場合)スクリプトを指します。
各ランレベルディレクトリ内のスクリプトはasciibetical順序で実行されるため、ランレベル内の順序が重要な場合は、それに応じてシンボリックリンクの名前を選択します。
Ubuntuの亜種とMintがsystemdに移行した今、上記に基づいた古いソリューションでは満足度が低いことがわかりました。私はsystemdでそれを行う方法を見つけるためにウェブを検索し、他の人の知恵を組み合わせて、次のチュートリアルを含むblogspot.com.auのブログ投稿として文書化しました。
systemdでは、以下のテンプレートを使用してスクリプトを呼び出す1つまたは2つのファイルを作成し、いくつかのコマンドを実行します。シンプル。
最初に、起動時またはシャットダウン時に実行するスクリプトを作成します。.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がマルチユーザーターゲットに入るたびに開始サービスが実行され、マルチユーザーターゲットを出るときに停止サービスが実行されます。アクティベーション条件が異なる代替サービスファイルについては、以下で説明します。
この説明は、/ 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_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
rc.shutdown
Linuxカーネルのシャットダウンスクリプトを使用する必要があります。OpenBSDのmanページを引用:
システムがreboot(8)またはhalt(8)コマンドを使用してシャットダウンされたとき、またはinit(8)がそのように通知されたとき、またはキーボードで要求された停止が発行されたとき(アーキテクチャがサポートしている場合)、rc( 8)引数 `` shutdown ''で呼び出されます。
そのため、rc.shutdownを開いて、実行したいシェルコマンドを追加するだけです。
更新:Linux MintはUbuntuをベースにしており、Ubuntuは異なる起動/シャットダウン手順を持っているため、ここに関連する手順を示します。
実行したいシェルスクリプトを記述し、それをの関連ディレクトリにコピーします/etc/rc*.d/
。*
スクリプトを実行したい時にランレベルに対応しています。
UbuntuはDebianのランレベル番号に従っているため、停止にはランレベル0、再起動にはランレベル6があります。
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を使用する必要があります。