This very first post of my new blog post series about useless use of some commands when writing shell scripts.

Let's start with find and grep. When I started with shell scriptig, I used to use find /path/to/dir | grep -E '\.ext$' in order to exclude files with .ext.

But, did you know find offers better way to exclude files? Try find /path/to/file ! -name '*.ext, the result will be the same, without spanning a new process.

How about exluding multiple extensions? One may ask. Just repeat ! -name ext like this: find /path/to/file ! -name '*.ext1' ! -name '*.ext2' ! -name '*.extN'. And depending on number files types/names to exlude, this may become unreadble. In this case, take advantage of operators offered by find: find /path/to/dir ! \( -name '*.ext1' -or -name '*.ext2' -or -name '*.extN' \)

I use bash since I started using Linux. Since then, I use few tricks to be more effcient. I started to write a simple page grouping few tricks I use every day. I will continue add some more as learn them. If you find this useful, you may also like:

Since few days some useful KDE apps hung when they are started. Okular is in this case, which is quite painful as I use this app many times a day. I used to reboot my workstation in order to resolve the issue until now. But, I got fed up with reboots. So, I started dig in order to resolve the issu.

The first move was to strace okular, by strace okular. After few seconds, the last line on the terminal was connect(10, {sa_family=AF_FILE, path=@"/tmp/fam-glennie"}, 110). This line is quite clear : fam stands for File Alteration Monitor. I switched to gamin few years ago beacause it uses inotify/dnotify under linux.

My first try was to kill gamin_server, and okular started instantaneously. So my issue was linked to gamin process. And now, I've a solution to resolve my issue without rebooting.

FYI, a bug is filled in debian bug tracker.

We offen need to add or remove an scsi or a fiber channel attached disk under Linux. This is can be done easly (be carefull when removing a device: do not forgot to unmount all filesystems present on the device to be removed. Moreover, before reducing disk size, underlaying partitions' size must be reduced).

  • Rescan scsi device bus: echo 1 | sudo tee /sys/class/scsi_device/*/device/rescan

  • Rescan device gemeometry change : echo "- - -" | sudo tee /sys/class/scsi_host/host*/device/scsi_host/host*/scan

  • When adding a disk to LVM by pvcreate one gets the message Can't open /dev/sdXy exclusively. Mounted filesystem or when creating a new filesystem one gets Permission denied while trying to determine filesystem size, this means that disk is locked. That is:

    • The device is locked because it's already mounted. Double check, if it's not the case.
    • The device is locked by multipathd. This was my case. This can be checked by sudo multipath -l. If your device is listed, then double check, if you aren't trying to use a wrong device.

    If the device is locked by *multipath* and if this is an error, then to remove the device from multipath's control, issue sudo multipath -f /dev/sdX to remove the device.

    After this, the device can use for LVM or a partition on it can formated.

Les baies de stockage actuels (au moins les baies 3Par) permettant de créer des luns en dynamic provisionning (ou thin provisionning) proposent de récuprér l'espace disk désallouée dynamiquement par la création de fichiers contenant des zéros. En fonction de l'OS (Linux, Unix ou Windows), la procédure varie:

  • Linux/Unix : La création d'un fichier contenant des zéros se fait par la commande dd qui partie des commandes système de base. Par exemple, dd if=/dev/zero of=ZeroFile bs=1G count=1 permet de créer un fichier de 1Go. Il existe également sfill (présent dans le package secure-delete sous Debian) permet d'écrire des zéros dans les blocs libres. sudo sfill -v -l -l -z -I créera un fichier ne contenant que des zéros.

  • Sous Windows, il faut installer sdelete proposé par microsoft. Une fois l'outil installé, la commande sdelete -z x:\ d'écrire des zéros dans blocs inutilisés du lecteur x:\

Certaines choses simples deviennt très compliquées (en tout cas pour moi) lorsqu'on essaye de mettre au point des scripts sous windows. En effet, en fonction de langue choisi pendant l'installation, tous les messages d'erreurs semblent être localisés et il ne semble avoir de solution pour modifier cette localisation au sein d'une script simplement. Du coup, lors du scripting batch sous windows, pour pouvoir traiter les messages retournés, il faut:

  • coder en dur dans toutes les langues, les messages d'erreurs corrspondants (au moins 2 dans mon cas: anglais et français).

  • déterminer la langue d'installation de l'OS pour pouvoir les traiter.

Et à la question comment peut-on déterminer la langue d'installation de Windows? La réponse est très simple: la commande ping -n 1 localhost | find /i /C "Reply from bytes=32" retourne 1 si windows est installé en anglais. La même commande retourne 0 s'elle est exécutée dans un envirionnement en français.

Les switchs brocade (de type 3200 au moins) proposent une interface graphique en java pour effectuer le paramètrage. Mais, cette interface n'est pas accessible sans disposer d'un navigateur avec le plugin java. Pour utiliser cette interface à partir d'un poste client sous debian, il faut: