スクリプトを実行するにはどうすればよいですか 自動的に Ubuntuが起動したときに起動後に手動で実行する必要はありませんか?
一つのアプローチは、@rebootを追加することです cron(クロン) タスク:
- ランニング
crontab -e
あなたのcronを編集することができます。 -
これに次のような行を追加します:
@reboot /path/to/script
コンピュータが起動すると、そのスクリプトが実行されます。
どのような種類のスクリプトを実行する必要があるかによって異なります。. サービスなどのために使用する必要があります upstart(アップスタート). しかし、ユーザースクリプトの場合、これらはgnomeによってセッションスクリプトとして起動されるべきです! システムの下で見てみましょう≫環境設定>スタートアップアプリケーション.
サイドノートでは、端末ログイン時にいくつかのスクリプトを実行する必要がある場合は、それらを追加することができます .bash_login ホームディレクトリ内のファイル。
14.04歳以上の方
単純なコマンド(実行し続ける必要がないコマンド)は、次のようなUpstartジョブを使用できます:
start on startuptaskexec /path/to/command
これをaに保存します .conf
でファイル /etc/init
(システムの起動時にrootとして実行する必要がある場合)、または ~/.config/upstart
(ログイン時にユーザーとして実行する必要がある場合)。
次のコマンドを追加できます /etc/rc.local
:
sudo nano /etc/rc.local
これにより、rootとしてコマンドが実行されます。
特定のユーザーとしてコマンドを実行するには、次のコマンドを使用します sudo -i -u
(-i
また、ログインシェルを実行するには)。 たとえば、永続的なSSHトンネルを確立するには、次のようにします。 myhost
で定義されていますが、 johndoe
s ~/.ssh/config
ファイル:
sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost
注意すべき点は、以下の場合 /etc/rc.local
存在しませんでした(16.04以降のUbuntuの場合のように)、あなたは追加する必要があります シェバン線 上部に(例えば、 #!/bin/bash
)、ファイルが実行可能であることを確認します:
sudo chmod a+x /etc/rc.local
15.04以降の場合:
(短命)を実行するには1 を使用して起動時のコマンド systemd
、タイプのsystemd単位を使用できます OneShot
. たとえば、次のように作成します /etc/systemd/system/foo.service
を含む:
[Unit]Description=Job that runs your user script[Service]ExecStart=/some/commandType=oneshotRemainAfterExit=yes[Install]WantedBy=multi-user.target
次に実行します:
sudo systemctl daemon-reloadsudo systemctl enable foo.service
基本的に、これは単に変換しています 典型的な成り上がりの仕事 systemdのものに(を参照してください 新興ユーザーのためのSystemd).
複数のコマンドを使用して、同じサービスファイルから複数のコマンドを実行できます ExecStart
ライン:
[Service]ExecStart=/some/commandExecStart=/another/command some argsExecStart=-/a/third/command ignore failure
コマンドは常にフルパスで指定する必要があります。 いずれかのコマンドが失敗した場合、残りのコマンドは実行されません。 A -
パスがsystemdにゼロ以外の終了ステータスを無視するように指示する前に(失敗と考えるのではなく)。
関連:
ユーザーセッションの場合は、systemdユニットを次の場所で作成できます ~/.config/systemd
代わりに。 これは16.04以降で動作するはずですが、systemdを搭載したUbuntuの以前のリリースでは動作しません(ユーザーセッションにはまだUpstartが使用されていたため)。 ユーザー-セッション-ユニットは、システム-サービスと同じコマンドで制御できますが、ユーザー-セッション-ユニットの制御は、システム-サービスと同じコマンドで制御できます。 --user
オプションが追加されました:
systemctl --user daemon-reloadsystemctl --user status foo.service
シェル構文
Upstartとは異なり、systemdは実行しないことに注意してください Exec*
シェルを介したコマンド。 これは、いくつかの制限された変数展開と複数のコマンドを実行します(で区切られ ;
しかし、それはシェルのような構文が行く限り、それについてです。 より複雑なものについては、リダイレクトやパイプなど、コマンドをラップします sh -c '...'
または bash -c '...'
.
1長命のデーモンとは対照的に。
コマンドを自動的に実行するには、さまざまな方法があります:
-
その upstart(アップスタート) システムは、ディレクトリ内の設定を見つけるすべてのスクリプトを実行します
/etc/init
. これらのスクリプトは、システムの起動時に(またはシャットダウン要求などの特定のイベントに応答して)実行されるため、ユーザーと対話しないコマンあなたは読むことができる紹介を見つけることができます: http://upstart.ubuntu.com/getting-started.html manページ
man 5 init
とman 8 init
あなたに完全な詳細を与えます。 -
という名前のシェルスクリプト
.gnomerc
あなたのホームディレクトリに自動的にGNOMEセッションにログインするたびに供給されます。 このスクリプトで設定した環境変数は、セッションで実行するすべてのプログラムによって表示されます。セッションは開始されないことに注意してください。
.gnomerc
したがって、長時間実行されるプログラムを自動起動する場合は、次のように追加する必要があります&
実行中のシェルからそれをデタッチするために、プログラムの呼び出しに。 メニューオプション システム-≫環境設定->スタートアップアプリケーション あなたのグラフィカルなセッションが開始されたときに起動する必要がありますどのようなアプリケーションを定義することができます(Ubuntuはかな これは、ほぼ同じ目的と範囲を持っています
.gnomerc
あなたが知っている必要はありませんを除いて、スクリプトsh
構文(ただし、どちらも使用できませんsh
プログラミング構築)。
$HOME/.config/autostart
スタートアップアプリケーションリストが含まれます。 .desktop
このフォルダ内のファイルは起動時に実行されます。 実行可能な権限が必要な場合があります(chmod +x startup.desktop
).
のサンプル例 .desktop
ファイル:
[Desktop Entry]Type=ApplicationExec="</path/to/script>"Hidden=falseNoDisplay=falseX-GNOME-Autostart-enabled=trueName=Startup Script
ここでは、 "</path/to/script>"
パスに置き換えられます。 script.sh
スクリプトを配置すると myscript
で /usr/local/bin
コマンドで直接実行できるように、次のように書くことができます myscript
の代わりに "</path/to/script>"
.
のサンプル例 myscript.sh
:
#!/bin/bash<commands to be executed>exit
結果:.desktop
からファイルが起動されます。 $HOME/.config/autostart
でスクリプトを実行しているかどうか、 Exec=
簡単なことのために、コマンドを追加することができます >>システム環境設定-セッション スクリプトの場所を指します。
または、/etc/initに追加することもできます。d/rc.ローカルまたは作る upstart(アップスタート) それはより多くの場合、ジョブ 低レベル 何か...
を見てみましょう https://help.ubuntu.com/community/UbuntuBootupHowto より多くの情報のため
cron
回答は、トップ投票とは異なる実装されています
この答えはまだ使用しています cron
しかし、トップ投票の答えとは異なる方法を使用しています。 これはUbuntu16.04以降で動作しますが、おそらくはるかに早くサポートされています。 それは私が使用し始めたことだけです cron
16.04以降のコンピュータの起動時にジョブを実行する。
いつ行うのですか cron
逃げる?
コメントでは、誰かが尋ねました"彼らはいつ実行しますか?". あなたはsyslog/journalctlで伝えることができます:
$ journalctl -b | grep cronJan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[985]: (root) CMD ( /usr/local/bin/cron-reboot-cycle-grub-background)Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root
注意すべきことの一つは cron
ジョブの実行状況をメールで送信することができます。 @reboot
ジョブは非常に早いネットワークマネージャを実行し、あなたが入れない限り、電子メールが実行されません sleep
スクリプトにコマンドを入力します。
スクリプトを配置する場所
ディレクトリにスクリプトを配置します /etc/cron.d
:
$ ll /etc/cron.dtotal 44drwxr-xr-x 2 root root 4096 Nov 26 19:53 ./drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../-rw-r--r-- 1 root root 244 Dec 28 2014 anacron-rw-r--r-- 1 root root 148 Feb 18 2017 cycle-grub-background-rw-r--r-- 1 root root 138 Mar 5 2017 display-auto-brightness-rw-r--r-- 1 root root 460 Nov 26 19:53 nvidia-hdmi-sound-rw-r--r-- 1 root root 102 Feb 9 2013 .placeholder-rw-r--r-- 1 root root 224 Nov 19 2016 touch-vmlinuz-rw-r--r-- 1 root root 700 Aug 5 11:15 turn-off-hyper-threading
スクリプトはどのように見えますか?
ここでは、各ブートを実行するために設定したスクリプトをいくつか紹介します:
$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin @reboot root /usr/local/bin/cron-reboot-cycle-grub-background$ cat /etc/cron.d/touch-vmlinuzSHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin@reboot root touch "/boot/vmlinuz-"`uname -r`
あなたが使用する必要があります upstart(アップスタート) このために。 Upstartは、自動的に起動されるUbuntuプロセスに使用されます。 これは、古いSystem-V initのような強化されたソリューションです。dスクリプト。 また、スクリプトの開始に前提条件を入れることもできます(つまり、ネットワークを実行する必要がありますか? など。)
カーネルが起動した直後にsystemdの前にスクリプトを実行したい場合は、AFAIKの方法は次のように追加しています init=/path/to/script
のカーネルコマンドラインに /boot/grub/grub.cfg
またはより多くの未来の証拠はあなた自身のメニュー記入項目を作ります /etc/grub.d/40_custom
からメニューエントリをコピーすることで、 /boot/grub/grub.cfg
そして、必要な変更を行う(と実行しています update-grub
その後のために grub
カスタムファイルを次の場所に追加するには /boot/grub/grub.cfg
).
linux /boot/vmlinuz-5.4.0-26-generic ... ro quiet splash
に変更
linux /boot/vmlinuz-5.4.0-26-generic ... ro quiet splash init=/path/to/script
適切に置くように注意してください。 #!/bin/bash
最初の行と exec /sbin/init
(もし /sbin/init
カーネルパニックを避けるために、最後にsystemd)を指します。
誰かがいつ、どこで、それは素晴らしいだろうの両方を示すことができれば。 他のアプリケーションが開始される前に起動するスクリプトを開始するには、少なくとも2つの方法があることを知っているので、これを言います(X11
+1@GabrielFairに。 問題の大部分は、元の質問と回答が10歳であることです。 私はまた、この問題を解決するにはあまりにも多くの方法があると付け加えたいと思います。 Unixの哲学の単純さに何が起こったのですか?! 誰かに知識を要求し、十分な点でこの投稿を書き直すか、最新のosバージョンの新しい最新の決定的な答えを追加してください。
この回答スレッド全体が混乱しています。 Stack Exchange形式はこの質問には最適ではないようです