# Pomocy przy prostym skrypcie SHUTDOWN

## rybik

Witam

Nie potrafie pisać skryptów a potrzebuję wyłączyć system jako user po kliknięciu na ikonę (bez potwierdzenia zamknięcia systemu).Znalazlem w google stronę

https://fitzcarraldoblog.wordpress.com/2015/09/06/gentoo-linux-run-a-script-at-shutdown-but-not-when-rebooting/

robię skrypt i nadaję mu wykonalność

```
#!/bin/bash

if [ `who -r | awk '{print $2}'` = "0" ]; then

  ######################################################################

  # Put Bash commands here to be executed on shutdown but not on reboot.

  ######################################################################

fi

$
```

i nie odpala się.Otrzymuje komunikat

```
$ /etc/local.d/10-run_on_shutdown.stop

/etc/local.d/10-run_on_shutdown.stop: linia 3: błąd składni przy nieoczekiwanym znaczniku `fi'

/etc/local.d/10-run_on_shutdown.stop: linia 3: `fi'

```

umie ktoś poprawić to,tak by skrypt zadziałał?

Z gory dziekuję

----------

## Jacekalex

Nie tędy droga.

Zainteresuj się pakietem sudo.

https://wiki.gentoo.org/wiki/Sudo

Jak zainstalujesz, skonfiguruj, żeby dla twojego usera albo grupy nie żadał hasła, np:

```
%wheel localhost=(root) NOPASSWD: /sbin/halt, /sbin/shutdown, /sbin/reboot , /sbin/poweroff 
```

Edycja /etc/sudoers wyłącznie przez polecenie (z uprawnieniami roota):

```
EDITOR="{Twój ulubiony edytor tekstowy}" visudo
```

z konta root, nawet nie próbuj inaczej.

Jak będziesz mógł odpalać poweroff bez hasła, to potem w skrócie na Pulpicie podasz:

```
sudo poweroff
```

 jako polecenie, i musi działać.

Możesz też  użyć mechanizmu ACPI,  np wyłączać kompa przyciskiem power, wymaga to zmodyfikowania skryptu /etc/apci/default.sh.

Przykład:

```

...

case "$group" in

   button)

      case "$action" in

         power)

        ######## dodałem osobiście  ########

               /sbin/shutdown -h now;      

         ######### koniec dodanego kawałka  ####### 

            #/etc/acpi/actions/powerbtn.sh

            ;;

         # if your laptop doesnt turn on/off the display via hardware

         # switch and instead just generates an acpi event, you can force

         # X to turn off the display via dpms.  note you will have to run

         # 'xhost +local:0' so root can access the X DISPLAY.

         #lid)

         #   xset dpms force off

         #   ;;

         *)   log_unhandled $* ;;

      esac

      ;;

...

```

Pozdro

 :Cool: 

----------

## sebas86

Po wypowiedzi sądzę, że korzystasz z graficznej sesji. Gdybyś jeszcze powiedział z jakiego środowiska graficznego korzystasz można byłoby podać rozwiązanie na tacy.

Masa środowisk, w tak tym popularne jak KDE, Gnome, XFCE, obsługują wyłączanie komputera przez wspólną „szynę” komunikacyjną. Dzisiaj system zawiera kilka usług, które umożliwiają przesyłanie wiadomości, obsługę żądań, tworzenie polityki bezpieczeństwa, nadawanie uprawnień itd. I najczęściej tutaj zaczynają się schody bo startując sesję graficzną trzeba również rozpocząć sesję na potrzeby jednej z tych usług oraz poprawnie ustawić kilka rzeczy.

Na przykładzie XFCE (https://wiki.gentoo.org/wiki/Xfce#Starting_Xfce_without_a_display_manager):

 *Quote:*   

> When experiencing authorization or permissions issues within xfce4 in a OpenRC profile (symptoms include being unable to open power manager and unable to suspend/hibernate) be sure the sys-auth/consolekit package has been merged with the pm-utils flag set. Then replace the above line in ~/.xinitrc with the following (see this entry on the Gentoo Forums for more information):
> 
> FILE ~/.xinitrcStarting xfce4 the right way when invoking startx
> 
> ```
> ...

 

Jeszcze prościej można rozwiązać sprawę korzystając z popularnych menadżerów logowania (KDM lub GDM), które inicjują taką sesję z automatu.

Jeśli masz działającą sesję i działa zamknięcie poprzez przycisk wyłączania/wylogowania, a potrzebujesz tylko skrypt/ikonkę to wystarczy wysłać przez dbus komunikat w odpowiednie miejsce:

```
dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
```

lub dla upower:

```
dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
```

Źródło: http://askubuntu.com/questions/454039/what-command-is-executed-when-shutdown-from-the-graphical-menu-in-14-04

I trochę nowsze jeśli korzystasz z upower (na 99% tak): https://bbs.archlinux.org/viewtopic.php?id=127962

Można też prościej ale to już zależy od środowiska graficznego, w XFCE można łatwo to zrobić poprzez sesję:

```
xfce4-session-logout --halt
```

----------

## Jacekalex

Moje rozwiązanie działa od lat na Gnome2, Mate, KDE4, KDE5, XFCE,  Enlightenment i LXQT.

Po prostu nie korzysta z żadnego API sroodowiska graficznego, tylko z sudo albo acpi, czyli mechanizmów obecnych we wszystkich Linuxach, bez względu na to, czy mają w ogóle środowisko graficzne i jakie mają to środowisko graficzne.

To by było na tyle

 :Cool: 

----------

