Ubuntu 16.10で起動時にコマンドを実行するにはどうすればよいですか(rc.local alternative)


49

Ubuntu 16.10を実行しているLinodeサーバーでクォータを設定していますが、次のエラーが表示されます

マウントされたデバイス/ dev / rootをstat()できません:そのようなファイルまたはディレクトリはありません

これを修正するために、このスレッドに追加して修正を行いました。

ln -s /dev/xvda /dev/root
/etc/init.d/quota restart

/etc/rc.local。しかし、Ubuntu 16.10はsystemdrc.localを使用する代わりにもう使用しません。の代替手段は何ですか?起動時に上記のコマンドを実行するにはどうすればよいですか?rc.local

また、を使用してサービスを有効にしましたsystemctl enable rc-local.serviceが、うまくいきませんでした。リードをいただければ幸いです。


ルートとして実行し、システムを再起動しましたか?
ジョージウドセン

はい@George、私は両方やった
Saurabh Sharmaの


うまく機能していない@George
Saurabh Sharma氏

ただ、は...それが飛ぶかどうかを確認し、このハックを見た
ジョージUdosen

回答:


65

イントロ

ジョージのリンクで提案されているように、新しいサービスを作成すべきではないと思います。rc-local.serviceすでにsystemdに中に存在し、サービスファイルは、ことを示唆しているrc.local、それが存在し、実行可能な場合、に自動的に引き込まれますmulti-user.target。だからを作成したり強制する必要はありませんsystemd-rc-local-generator

一つの解決策

簡単な回避策(それが標準的な方法かどうかはわかりません):

ターミナルで:

printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
sudo reboot

その後、rc.localシステムの起動時に呼び出されます。必要なものを挿入します。

バックグラウンド

ターミナルで行う場合:

sudo systemctl edit --full rc-local

ヘッドコメントに次のような行が含まれていることがわかります。

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.

これは、このシステムで/etc/rc.local実行可能なファイルが呼び出されると、multi-user.targetに自動的にプルされることを示しています。したがって、対応するファイル(sudo touch...)を作成し、実行可能(sudo chmod +x ...)にするだけです。


4
使用しないでください#!/bin/bash、しかし使用することを#!/bin/shあなたが本当にあなたのスクリプトではbashを必要としない限り。他のすべてのシステムスクリプトは、パフォーマンス上の理由から、bashではなくダッシュを使用します。
spikyjt

「systemd-rc-local-generatorによって別の方法で行われた何かを再作成したり強制したりする必要はありrc-localません」他のユニットの後にそれを注文することはできませんか?
x-yuri

20

systemd ここでの使用を含むこの解決策が提案されているのを見まし

  1. サービスを作成します。

    sudo vi /etc/systemd/system/rc-local.service
    
  2. そこにコードを追加します。

    [Unit]
    Description=/etc/rc.local Compatibility
    ConditionPathExists=/etc/rc.local
    
    [Service]
    Type=forking
    ExecStart=/etc/rc.local start
    TimeoutSec=0
    StandardOutput=tty
    RemainAfterExit=yes
    SysVStartPriority=99
    
    [Install]
    WantedBy=multi-user.target
    
  3. 作成して/etc/rc.local実行可能であることを確認し、その中にこのコードを追加します。

    sudo chmod +x /etc/rc.local

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    exit 0
    
  4. サービスを有効にします。

    sudo systemctl enable rc-local
    
  5. サービスを開始してステータスを確認します。

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    
  6. すべてうまくいけばcode/etc/rc.localファイルに追加してから再起動できます。

注: Lubuntu 16.10でテスト済み。

ソース:

https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd


すべての手順を実行しました。のtouch "hello"前にrc.localがありexit 0ます。サービスはアクティブなようですが、ubuntu 16.04アラビア語5.31
Danny182

@Janの答えが指摘するように、systemdはすでにrc.localをサポートしているため、まったく新しいサービスを作成する必要はありません。
トミーピーナッツ

これはちょうど働く、youuuuuuuuuuuuuuuuuuuuありがとう
GPrathap

2

Janの答えに追加すると、通常のrc.localファイルとrc-local serviceは異なり、すべてのサービスが開始された後ではなく、ネットワークがオンラインになった後に実行されます。

場合によっては、rc.local後でコマンドを実行することもできます。たとえば、lxd開始後に実行する必要がありました。

この場合、次の 内容のrc-local serviceドロップインconfファイルを作成して、起動時の依存関係 を編集できます/etc/systemd/system/rc-local.service.d/override.conf

[Unit]
After=network.target lxd.service

必要なユニット名を追加できる場所(追加したようにlxd.service

systemctl daemon-reloadその後を忘れないでください。


Ask Ubuntuへようこそ!別の回答を改善したい場合は、編集を提案してください。部分的な代替案を提示する場合は、同じ部分を繰り返しまたは引用して(元の回答が変更された場合)、相違点を強調してください。いずれにしても、新しい不完全な回答を作成しないでください!ありがとうございました。
デビッドフォースター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.