Bashスクリプトを使用したプログラムの切り替え

Bashスクリプトを使用したプログラムの切り替え

これを切り替えることができるスクリプト(ナイトモードアプリ)を作成しようとしていますredshift。それで私はこうしました。

#!/bin/bash

pgrep redshift > /dev/null && \ 
         killall redshift || \
         setsid redshift [options] &> /dev/null

これにより、プログラムがバックグラウンドで実行されている場合は終了し、それ以外の場合は実行中になりますsetsid。このスクリプトはプロセスを終了すると機能しますが、もう一度実行するとスクリプトがハングします。

  • 私は何が間違っていましたか?
  • 端末を終了してもプログラムが停止しないようにプロセスをバックグラウンドに配置する他の方法はありますか?

答え1

Bashを使用してプログラムを呼び出すと、Bashはそれを&>ユーザーが望むもの(バックグラウンド演算子とstdoutリダイレクト)ではなく、特別なリダイレクト演算子(stdoutとstderrの両方に&リダイレクト)として解釈します>。 2 つのタグを分離すると、予想されるバックグラウンド動作を得ることができます。

#!/bin/bash

pgrep redshift > /dev/null && 
  killall redshift || 
    setsid redshift [options] & > /dev/null

将来の自分にもっと親切に対処し、論理を少し拡張することを検討してください。それを殺したい場合は、redshiftいくつかのオプションを使用して実行してください。

if pgrep redshift > /dev/null
then
  pkill redshift
fi
setsid redshift options & > /dev/null 

答え2

redshiftには切り替え機能があります

切り替えるには、信号SIGUSR1を赤色片がプロセスに送信します。

pkill -USR1 redshift

記録があります彼らのウェブサイトから、しかしはありませんソフトウェア文書。一つ開いたフルリクエストこの機能はマニュアルページに文書化されています。

答え3

私はGnomeのデスクトップアイコンを切り替えるために使用します。

pkill nemo-desktop || nemo-desktop

もちろん、これは赤い編みにも当てはまります。

pkill redshift || redshift

関連情報