

CentOS 8 で、topコマンドの結果を10秒毎にログファイルに記録するシェルスクリプトを作りました。

[code]

    #!/bin/sh
    
    while true
    do
      top -b -n 1 | head -30 >> /var/log/process-logger.log
      sleep 10
    done
    
[/code]

このスクリプトを systemctl でサービス起動するようにしました。サービス設定ファイルは次の内容です。

[code]

    [Unit]
    Description=Process Logger
    After=network.target
    
    [Service]
    Type=simple
    ExecStart=/home/username/process-logger/main
    WorkingDirectory=/home/username/process-logger
    KillMode=process
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    
[/code]

その結果、 **topコマンドの出力プロセス名が短縮** されてログファイルに記録されるようになりました。  
例えば、元々は次の内容だったのが、

[code]

        6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-kblockd
        8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq
    
[/code]

systemctl で起動した場合は次のように **プロセス名が途中までしかなく残りは「+」記号** になります。

[code]

        6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0+
        8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu+
    
[/code]

端末でスクリプトを手動実行した場合は問題ありません。  
systemctl から実行すると短縮されてしまうように見えます。

これはなぜでしょうか？  
短縮せずにぜんぶ出てくるようにはできないでしょうか？

よろしくお願いします。


CC BY-SA 4.0
2021-09-26T08:13:26.143
82692
2021-09-28T15:45:06.547
2021-09-27T03:09:37.547
3060
43135
question
linux centos shellscript systemd
systemctlで起動した自作スクリプトでtopコマンドを取得するとプロセス名が短縮されてしまうのはなぜでしょうか？


質問者ですが、コメントいただいて解決しました。

  * top コマンドにオプション `-w 512` をつけることで解決しました。（プロセス名が短縮されなくなりました）
  * man top の -w の項に次のように記載されていました。

> Note: Without the use of this command-line option, output width is always
> based on the terminal at which top was invoked whether or not in Batch mode.

  * おそらく top コマンドは起動された端末ウィンドウの幅に応じて出力を調整するよう実装されているが、起動元が systemctl や cron の場合は端末がないため最小幅が採用されて、結果プロセス名が短縮されたのかなと思います。

@metropolis さん @cubick さん ありがとうございました。


CC BY-SA 4.0
2021-09-28T15:34:01.103
82736
2021-09-28T15:45:06.547
2021-09-28T15:45:06.547
43135
43135
82692
answer