sudoを使用したBashスクリプト - 信頼できないバックグラウンドリカバリ(bg)

sudoを使用したBashスクリプト - 信頼できないバックグラウンドリカバリ(bg)

test.shルートディレクトリのディスク使用量を表示する次の単純なbashスクリプト(と呼ばれる)があります。sudoすべてのディレクトリを一覧表示する必要があります(sudoパスワードを入力する必要はありません)。

#!/bin/bash
sudo du -h --max-depth=1 / 2> /dev/null

ディレクトリが私のパスにあり、次のスクリプトを実行します(出力をテキストファイルに出力するため)。

$ ./test.sh >> ./test.txt

Ctrl+pauseで作業すると、次のような結果がZ得られます。

^Z
[1]+  Stopped                 ./test.sh >> ./test.txt

その後、バックグラウンドで再起動すると、次の結果bgが表示されます。

$ bg
[1]+ ./test.sh >> ./test.txt &

[1]+  Stopped                 ./test.sh >> ./test.txt

$ jobs
[1]+  Stopped                 ./test.sh >> ./test.txt

(追加試行のbgため、実際に2〜3回試行した後、バックグラウンドでスクリプトが再起動される可能性がありますが、これは散発的なようです...)

ただし、 continue を使用すると、スクリプトfgはフォアグラウンドで実行されます。

$ fg
./test.sh >> ./test.txt

結果は次のように書き込まれますtest.txt

3.8M    /root
4.0K    /authentic-theme
4.0K    /srv
72K     /tmp
3.2G    /snap
4.0K    /media
8.4M    /etc
0       /proc
0       /sys
4.0K    /cdrom
16K     /opt
16K     /lost+found
24K     /dev
4.3M    /run
263G    /mnt
14M     /home
19G     /var
245M    /boot
3.8G    /usr
297G    /

スクリプトを次のように変更すると、いいえsudo代わりにrunスクリプトを使用すると、Normalsudoを使用してバックグラウンドで再起動しbgてスクリプトを実行できます。

$ sudo ./test.sh >> ./test.txt 
^Z
[1]+  Stopped                 sudo ./test.sh >> ./test.txt

$ bg
[1]+ sudo ./test.sh >> ./test.txt &

$ jobs
[1]+  Running                 sudo ./test.sh >> ./test.txt &

以下を使用してコマンド全体を実行すると、sudo同じことが起こります。

$ sudo du -h --max-depth=1 / 2> /dev/null >> ./test.txt
^Z
[1]+  Stopped                 sudo du -h --max-depth=1 / 2> /dev/null >> ./test.txt

$ bg
[1]+ sudo du -h --max-depth=1 / 2> /dev/null >> ./test.txt &

$ jobs
[1]+  Running                 sudo du -h --max-depth=1 / 2> /dev/null >> ./test.txt &

何が起こっているのかを説明できる人はいますか?sudoコマンドとスクリプトを使用してバックグラウンドで再開できますが、スクリプトにまったく同じコマンドを使用するコマンドが含まれていると、バックグラウンド再開がsudo明らかbgに機能しないのはなぜですか?

私はUbuntu 22.04.1を使用しており、デフォルトのBashバージョンは5.1.16です。

編集#1:コマンドが別のエイリアスを有効にしたことを知らせることができますalias sudo='sudo 'sudoただし、このエイリアスを使用または使用せずにテストしたところ、すべてのbg場合に同じ不規則な回復動作が発生しました。 *

編集#2: jobs -l次の一般的な情報を提供します。

jobs -l
[1]+ 1074808 Stopped                 ./test.sh >> ./test.txt

編集#3:私は通常で実行しますtmuxが、なしでテストしましたが、tmux問題は持続します。

編集#4:SuperMicroサーバーに加えて、ラップトップ(Aorus X5)でテストするためのRaspberry PiとUbuntu VMもあります。これは本当に奇妙です:

  • 私のUbuntu VM(Windows 10のVMWare)にこの問題があります。確かにみんなに起こります。すべての場合において、bg最初は正しく修復されます。
  • 私のRaspberry Piで問題が解決しません。通常、bg正しく回復するには2〜3回の試みが必要です。

仮想マシンではなく、メインサーバーとRaspberry Piで実行されているソフトウェアをテストする必要があると思い始めました。

編集#5:stty -tostop残念ながら、スクリプトを実行する前に設定しても問題は解決しません。ほとんどの場合、正しく回復するにはまだ2〜3回の試みが必要です。最初の試みに成功した場合も何度もありましたが、どんなものよりも良い機会だと思います。

編集#6:私のRaspberry Piで実行されるサービスは次のとおりです。

$ systemctl --type=service --state=running
  UNIT                             LOAD   ACTIVE SUB     DESCRIPTION                                            
  atd.service                      loaded active running Deferred execution scheduler
  containerd.service               loaded active running containerd container runtime
  cron.service                     loaded active running Regular background program processing daemon
  dbus.service                     loaded active running D-Bus System Message Bus
  docker.service                   loaded active running Docker Application Container Engine
  [email protected]               loaded active running Getty on tty1
  irqbalance.service               loaded active running irqbalance daemon
  ModemManager.service             loaded active running Modem Manager
  networkd-dispatcher.service      loaded active running Dispatcher daemon for systemd-networkd
  packagekit.service               loaded active running PackageKit Daemon
  polkit.service                   loaded active running Authorization Manager
  prometheus-node-exporter.service loaded active running Prometheus exporter for machine metrics
  rsyslog.service                  loaded active running System Logging Service
  [email protected]       loaded active running Serial Getty on ttyS0
  smartmontools.service            loaded active running Self Monitoring and Reporting Technology (SMART) Daemon
  snapd.service                    loaded active running Snap Daemon
  ssh.service                      loaded active running OpenBSD Secure Shell server
  systemd-journald.service         loaded active running Journal Service
  systemd-logind.service           loaded active running User Login Management
  systemd-networkd.service         loaded active running Network Configuration
  systemd-timesyncd.service        loaded active running Network Time Synchronization
  systemd-udevd.service            loaded active running Rule-based Manager for Device Events and Files
  udisks2.service                  loaded active running Disk Manager
  unattended-upgrades.service      loaded active running Unattended Upgrades Shutdown
  unbound.service                  loaded active running Unbound DNS server
  [email protected]                loaded active running User Manager for UID 1000

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
26 loaded units listed.

私はこれが私がインストールしてアクティブにしたと思います(そしてSuperMicroとRaspberry Piで実行されます):

  containerd.service               loaded active running containerd container runtime
  docker.service                   loaded active running Docker Application Container Engine
  prometheus-node-exporter.service loaded active running Prometheus exporter for machine metrics
  smartmontools.service            loaded active running Self Monitoring and Reporting Technology (SMART) Daemon
  unbound.service                  loaded active running Unbound DNS server

テストする事項:

  • sudo設定を確認してNOPASSWD影響があるかどうかを確認してください。
  • SuperMicroサーバーとRaspberry Piの間に共通にインストールされているサービスを無効にします。

答え1

通常、プログラムがバックグラウンドで実行を拒否するのは、入力が必要なためです。実際には標準入力からは読み
ませんが、dfまだ開いています。努力する:

#!/bin/bash
sudo du -h --max-depth=1 / 2> /dev/null 0< /dev/null

これにより、パスワードを入力できなくなる可能性があります。

あるいは、関連する信号をプロセスに送信しようとすることはそうでないため、問題になる可能性があります。それは疑問ですが、その場合は、まずバックグラウンドで実行することをお勧めします。 (これは私にとって問題ではありません。)

関連情報