ルートとしてブート中にスクリプトを実行する方法


59

networkmanagerを使用せずにwifiを自動的に有効にするスクリプトがありましたが、システムの起動中にrootとしてスクリプトを実行する方法がわかりません。ブート中にスクリプトを自動的に実行するにはどうすればよいですか?


自動起動プログラムはで構成されたautostartマニフェストやで*.service同様のように、複数の場所にあるファイルinit.dまたはcrontab。これを参照してください:unix.stackexchange.com/a/525845/43233
Noam Manos

回答:


54

実行するスクリプトを/etc/init.dディレクトリに配置し、スクリプトを実行可能にします。

chmod 755 myscript

それが完了したら、使用したいランレベルディレクトリにシンボリックリンクを作成します。たとえば、Ubuntuのデフォルトランレベルであるグラフィカルランレベル2でプログラムを実行したい場合は、/etc/rc2.dディレクトリに配置します。ディレクトリに配置することはできません。「S」で起動を示すことにより、実行するタイミングを示す必要があり、実行順序が重要です。番号を大きくすることにより、ディレクトリにある他のすべての後に配置します。

実行する最後のスクリプトがでありrc.local、名前が付けられている場合はS99rc.local、スクリプトをとして追加する必要がありますS99myscript

ln -s /etc/init.d/myscript /etc/rc3.d/S99myscript

下位互換性のある各/etc/rc*.dディレクトリには、/etc/init.d/ディレクトリへのシンボリックリンクがあります。


1
Ubuntu Server 14.04では、例に示されている/etc/rc2.d代わりにを使用する必要があることに注意してくださいrc3.drc2.dグラフィカルな実行レベルだけではないようです。
ブラッド14

1
cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.dこれに行くことができます/etc/rc?.d、あなたのデフォルトのランレベルに対応するディレクトリ。
ケビン

1
代わりに:「最後に実行されるスクリプトがでありrc.local、名前が付けられている場合はS99rc.local、スクリプトをS99myscript。として追加する必要があります。」「最後に実行するスクリプトmyscriptが名前付きのS99myscript場合、スクリプトをS99myscript。として追加する必要があります。」???
ドール

6
systemdでは動作しません(つまり、Ubuntu 16.04以降)。代わりにこれを参照してください。
アレクサンダー・レボ

26

にコマンドを含めます/etc/rc.local。ユーザーのランレベルが変更されるたびに実行されます。

注:/etc/rc.localの「exit 0」を含む最後の行の前にコマンドを配置する必要があります。


3
注意:あなたはで最後の行の前にコマンドを配置する必要があり/etc/rc.local、その含まれています exit 0
rubo77

3
/etc/rc.localubuntu 15.10では、「このスクリプトは各マルチユーザーランレベルの最後に実行されます」というコメントがあります。そのため、起動中にスクリプトを数回実行できますか?
ジャーノ

@jamo、はい、各ランレベルで。これが「起動時」の実行にどのように関係するかはわかりませんが、これは通常「起動時に1回実行」を意味します。
erm3nda

17

crontabオプションを使用して、再起動後にスクリプトを実行します。

あなたはcronで@rebootコードを追加することでそれを行うことができます

rootユーザーでcrontabを開きます。

$ sudo crontab -e

下部に次のレコードを追加します。

@reboot yourScriptPath 

それはあなたが望むことをします。


crontab -eスーパーユーザー権限を必要としないcommandを使用するつもりですか?ルートとして実行する必要のあるスクリプトを実行できるかどうかは疑問です。
jarno

これをテストしました。スクリプトはルートとして実行されません。
ヤルノ

4
コマンドの実行中に行を追加して、sudo crontab -e起動時にスクリプトをルートとして実行する必要があります。
jarno

削除することを忘れないでください/var/run/crond.reboot、そうでなければ、タスクを実行しません
アルバートカタラ

記録のためだけに、@ jarnoがすでにそれを知っていると確信しています。各ユーザーは独自のcronタスクを持っているため、ユーザーのcronタスクに追加すると(sudoなしでcrontab -eを実行)、スクリプトはユーザーによって実行されます。したがって、ブート時にスクリプトをルートとして実行できるようにするには、ルートとして実行する必要があります。
エディフェレトロ

9

これはUbuntu 17.04で私のために働いた:

  1. disable_cdrom便利な場所にツアースクリプトファイルを作成します。私の場合home/yterle/disable_cdrom。私の場合:

    #!/bin/sh
    eject /dev/sr0 -i 1
    
  2. 実行可能にする chmod 775 disable_cdrom

  3. ファイルに移動し/etc/systemd/systemて作成しserviceます。例えばsudo gedit /etc/systemd/system/disable_cdrom.service

disable_cdrom.serviceはこのように見えます:

[Unit]
Description=Disable cdrom

[Service]
Type=oneshot
ExecStart=/bin/sh /home/yterle/disable_cdrom

[Install]
WantedBy=multi-user.target

ExecStartスクリプトを実行する場所/bin/sh

次にsystemctl enable disable_cdrom.service、systemdサービスを有効にするために実行します


1
私が探していたのでこれを投票するが、あなたが意味すると思うsystemctl enable disable_cdrom.service
-KennetRunner

5

スクリプトファイルに/etc/init.d/ 実行可能権限を含めてから、異なる実行レベルを設定します

$ update-rc.d script-name default

スクリプトを起動時に起動します。


Kali Linux v2.0では動作しません。という意味update-rc.d script-name enableですか?
ソパラホデアリエレス

あなたは/etc/init.d/の時にコピーを持って更新-rc.dの<スクリプト名>デフォルトのシェルスクリプト<スクリプト名>
MS Parmar

4

次のようなテキストファイルを作成します/etc/cron.d/

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

@reboot   root    yourScriptPath

yourScriptPath実行するスクリプトへのパスに置き換える必要があります。)


1

スクリプトの追加に注意してくださいrc.local- そのため、スプラッシュスクリーンで立ち往生しました。Alt+を押すとF1、スプラッシュスクリーンの背後で何が起こっているかがわかります(スクリプトrc.localが実行されていました)。

私はそれから抜け出すことができませんでした。

  • Ctrl+ Alt+ Delまたは
  • Alt+ PrtSc+ Kまたは
  • Ctrl+ Alt+F#

何も動作しません。

USB Ubuntuイメージから起動し、検索してrc.local、ファイルへのアクセス許可を付与し、削除する必要がありました。自分が何をしているのかわからない場合は、何もすべきではないと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.